std::function

在c++98&03时我们通常使用回调函数来处理一些需要某种场景下才触发的回调操作,但回调函数有一个限制就是它只能赋值给同类型的全局或者静态函数,对于其他有相同的返回值和相同类型参数的成员函数不能赋值。

#include <iostream>
using namespace std;//define a callback func
typedef void(*CALL_BACK)(void);//global func
void show(void)
{cout << "show global func" << endl;
}class A
{
public://member funcvoid show_class_num(void ){ cout << "show member func" << endl; }//static member funcstatic void show_class_num_static(void ){ cout << "show static member func" << endl; }
};int main()
{CALL_BACK call;//assign a global func to callback funccall = show;call();//error call = A::show_class_num;//assign a static member funccall = A::show_class_num_static;call();return 0;
}

在了解C++11中引入的std::function前,首先我们需要了解C++中有关可调用实体(callable target)的相关概念,C++中包含了几种可调用对象:函数,函数指针,lambda表达式,std::bind创建的对象,以及重载了()操作符的类。函数以及函数指针这个就不用介绍了,有关lambda表达式也是C++11引入的一个新特性,就地创建匿名表达式,读者可以参阅相关介绍lambda的文章,我后续也会写一篇关于lambda的详解,这个需要说的是重载了操作符()的类也称为可调用对象。

// 仿函数(functor)
class Functor
{
public:int operator()(int a){return a;}
}

这个类也称为仿函数类。

C++11中引入了std::funtion这个模板类,这个模板类是一个多用途的函数包裹器,std::function的实例可以存储,拷贝和调用任何的可调用实体,包括全局函数,成员函数,lambda表达式和仿函数以及std::bind绑定的对象,甚至是成员变量,std::function统一和简化了相同类型可调用实体的使用方式,使得编码变得更简单。

std::function的原型:

template< class R, class... Args >
class function<R(Args...)>
R是返回值类型,Args是函数的参数类型,实例一个std::function对象很简单,就是将可调用对象的返回值类型和参数类型作为模板参数传递给std::function模板类。比如:

std::function<void()> f1;

std::function<int (int , int)> f2;

std::function的使用

#include <iostream>
#include <functional>using namespace std;std::function<int(void)> func;int testFunc()
{cout << "global Func" << endl;return 0;
}auto lambda = [](void) -> int {cout << "lambda func" << endl; return 0; };class Func
{int operator()(void){cout << "仿函数" << endl;return 0;}
};class CFuntion
{
public:int ClassMember(){ cout << "class member function" << endl; return 0; }int static StaticClassFunc(){ cout << "static class member function" << endl; return 0; }
};
int main()
{func = testFunc;func();func = lambda;func();func = CFuntion::StaticClassFunc;func();CFuntion classFunc;func = std::bind(&CFuntion::ClassMember, classFunc);func();return 0;
}

可见std::function的使用其实是很简单的,只要创建一个模板类对象,病传入相应的模板参数就可以存储任何具有相同返回值和参数的可调用对象,在调用的时候直接将std::function对象加上()就可以调用存储在其中的可调用实体,需要注意的是创建的std::function对象中存储的可调用实体不能为空,若对空的std::function进行调用将抛出   std::bad_function_异常。

C++11新特性之std::function std::bind相关推荐

  1. c++11新特性之完美转发(std::foward)

    完美转发 文章目录 完美转发 引用折叠 引用折叠 也就是在c++11里面是没有引用的引用的T& &r=x这时候会发生引用折叠 也就是一般发生在 模板实例化 auto decltype ...

  2. 【C++】C++11新特性——可变参数模板|function|bind

    文章目录 一.可变参数模板 1.1 可变参数的函数模板 1.2 递归函数方式展开参数包 1.3 逗号表达式展开参数包 1.4 empalce相关接口函数 二.包装器function 2.1 funct ...

  3. C++11新特性以及std::thread多线程编程

    一 .C++11新特性 1. auto 类型推导 1.1 当=号右边的表达式是一个引用类型时,auto会把引用抛弃,直接推导出原始类型: 1.2 当=号右边的表达式带有const属性时,auto不会使 ...

  4. C++11 新特性之std::thread

    C++11 新特性之std::thread 原文:https://blog.csdn.net/oyoung_2012/article/details/78958274 从C++11开始,C++标准库已 ...

  5. 详谈C++11新特性之future及开源项目ananas(folly,std c++11和ananas的future各自的区别是?)

    一.前言 1.最早我是从微信公众号看到这篇文章的,了解到开源项目ananas(A C++11/golang protobuf RPC framework)实现了Linux高性能网络库和rpc功能,里面 ...

  6. c++11新特性的使用---可变模板参数、type_traits、function综合使用

    DLL帮助类 c++中手动调用dll是比较繁琐的,调用过程是:加载dll后还要定义一个对应的函数指针类型,接着调用GetProAddress获取函数地址,在转成函数指针,最后调用该函数如下例子: #i ...

  7. C++11 std::function, std::bind, std::ref, std::cref

    C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段 ...

  8. c++11新特性_c++11新特性(四)

    4.lambda.bind.function 4.1.直接lambda表达式 lamda表达式不仅仅是一个语法新特性,对于没有用过java或C#lamda表达式读者,C++11的lamda表达式在一定 ...

  9. C++11 新特性简介

    1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...

  10. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

最新文章

  1. python数据库框架_Python数据库及ORM框架对比选择
  2. C 实现strcpy函数
  3. EXT.NET高效开发(一)——概述
  4. SpringMVC解决跨域的两种方案
  5. IntelliJ IDEA 的 Build Project/Build Module/构建项目/构建模块
  6. 部署 Job (第四部分)
  7. 什么是13薪,真的有18薪、25薪的不?
  8. loadrunner常见问题及解决方案
  9. Dreamweaver做网页
  10. POJ 2525 Text Formalization 笔记
  11. 完美者常用软件光盘2008
  12. cuteFTP使用教程
  13. Guava: Joiner
  14. 趣图:程序员的斗志曲线图
  15. 元宇宙「虚拟世界」,构建身临其境的社交世界
  16. qs计算机专业排名2017,2017年最新世界大学专业排名权威发布!
  17. 计算机网络知识点整理---应用层(六)
  18. kaggle实战——What Causes Heart Disease?
  19. 家里wifi网速越来越慢_家中的Wifi越来越慢,其中的原因竟然如此简单!
  20. Dell技术支持年度笑话总结

热门文章

  1. 乐优商城(填坑)——秒杀商品添加
  2. C++学生志愿填报信息管理系统
  3. ORA-01008:并非所有的变量都已绑定
  4. Adaptive Deconvolutional Networks for Mid and High Level Feature Learning
  5. PTA 天梯赛 L1-020 帅到没朋友 (20 分) Java
  6. C语言KMP算法之病毒检测
  7. tomcat jndi mysql_Tomcat使用JNDI配置数据源
  8. 阿里云产品ODPS的简介和使用方法
  9. Win11注册表编辑器误删了如何恢复?
  10. win10系统(64位)修复无法正常预览PDF内容的办法(非缩略图)