• C++ 11新特性之std::function类模板与std::bind绑定器介绍


    std::function介绍

    • 在c++中,可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定的对象,或者实现了operator()的对象
    • c++ 11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。通过指定它的模板参数,可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。
    • std::function对象最大的用处就是实现函数回调
    • 语法:std::function<返回值类型(参数类型)>
    • 示例
      •   #include 
          #include 
        
          void func1(){
          	std::cout<<"this is func1"< f1 = func1;
          	//调用
          	f1();
        
          	std::function f2 = func2;
          	//调用
          	f2(10, 20);
        
          	//绑定类静态成员函数
          	std::function fa = A::funcA;
          	//调用
          	fa();
        
        
          	system("pause");
          	return 0;
          }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
    • 执行结果
      •   this is func1
          10 + 20 = 30
          this is funcA
          请按任意键继续. . .
        
        • 1
        • 2
        • 3
        • 4

    std::bind介绍

    • std::bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。
    • std::bind绑定的参数个数不受限制,绑定的具体哪些参数也不受限制。
    • 语法:auto newCallable = bind(callable, arg_list);
      • newCallable : 可调用对象
      • callable : 要调用的对象
      • arg_list : 逗号分隔的参数列表
    • 示例
      •   #include 
          #include 
        
          void func1(){
          	std::cout<<"this is func1"<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 执行结果
    •   this is func1
        10 + 20 = 30
        11 + 90 = 101
        请按任意键继续. . .
      
      • 1
      • 2
      • 3
      • 4
  • std::function与std::bind配合使用

    • 示例
      •   #include 
          #include 
        
        
          class A{
          public:
          	void func(int x, int y){
          		std::cout << "x = "<< x <<", y = "<< y << std::endl;
          	}
          	int a;
          };
        
          int main(){
        
          	A objA;
        
          	//绑定成员函数
          	std::function fa = std::bind(&A::func, &objA, std::placeholders::_1, std::placeholders::_2);
          	//调用
          	fa(11, 22);
        
          	//绑定成员变量
          	std::function f2 = std::bind(&A::a, &objA);
          	f2() = 1234;
          	std::cout<<"objA a = "<< objA.a << std::endl;
        
          	system("pause");
          	return 0;
          }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
    • 运行结果
      •   x = 11, y = 22
          objA a = 1234
          请按任意键继续. . .
        
        • 1
        • 2
        • 3
  • 相关阅读:
    【LeetCode】Day109-最长回文串
    常用矩阵求导公式速查
    TS类中初始化属性语法糖
    世界连续动作预测模型-方向模型
    深入理解面向对象(第二篇)
    前后端结合解决Excel海量公式计算的性能问题
    Element+Vue+OpenLayers webgis实战
    问:React的setState为什么是异步的?
    C++(Qt)软件调试---GCC编译参数学习-程序检测(13)
    makefile的基础使用
  • 原文地址:https://blog.csdn.net/new9232/article/details/128158796