相关博文:C++新特性探究(十四):function
相关博文:C++头文件<functional>和bind、placeholders占位符使用简单例子
相关博文:《Essential C++》笔记之设计一个泛型算法(二)
相关博文:C++Function Object Adapter之not1
相关博文:C++之再探参数绑定bind、bind1st、bind2nd、placeholders占位符
相关博文:C++新特性探究(十五):bind

bind语义

  bind 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函数、静态函数、类静态函数甚至是类成员函数,参数包括普通参数和类成员。绑定后的结果,可以使用 std::function 进行保存,并延迟调用到我们需要的时候。

一. 绑定普通函数与参数及占位

  bind绑定的顺序,也就是函数中形参的声明顺序。
  placeholders::_x中的序列是实参的顺序。

例1:

运行结果:

附例1代码:

//小问学编程
#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;double myDivide(double x,double y)
{return x/y;
}int main()
{//零个参数 return 10/2auto fn_five=bind(myDivide,10,2);cout<<fn_five()<<endl;//一个参数 return x/2             auto不可省auto fn_half=bind(myDivide,placeholders::_1,2);cout<<fn_half(10)<<endl;//一个参数 return 2/xauto fn_half2=bind(myDivide,2,placeholders::_1);cout<<fn_half(10)<<endl;//两个参数 return int x/yauto fn_rounding=bind<int>(myDivide,_1,_2);cout<<fn_rounding(10,3)<<endl;//反转参数 return y/xauto fn_invert=bind(myDivide,_2,_1);cout<<fn_invert(10,2)<<endl;return 0;
}

二. 绑定对象与成员及占位

  绑定对象及成员函数时,顺序是调用成员,对象,[参数]。成员,对象及参数不能有缺位,缺位可用 placeholders::_x 来占位。否则编译不过。

例2:

运行结果:

三. 函数重载情形

例3:

//小问学编程
#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;int add(int x,int y)
{cout<<"int add(int x,int y)"<<endl;return x+y;
}
double add(double x,double y)
{cout<<"double add(double x,double y)"<<endl;return x+y;
}class MyPair
{public:int add(int x,int y){cout<<"MyPair::int add(int x,int y)"<<endl;return x+y;}double add(double x,double y){cout<<"double add(double x,double y)"<<endl;return x+y;}
};int main()
{auto bindGlobalFunc=bind((int(*)(int,int))add,_1,_2);cout<<bindGlobalFunc(1,2)<<endl;auto bindGlobalFunc2=bind(static_cast<double(*)(double,double)>(add),_1,_2);cout<<bindGlobalFunc2(1,2)<<endl;MyPair mp;auto bindMemberFunc=bind(static_cast<double(MyPair::*)(double,double)>(&MyPair::add),mp,1,2);cout<<bindMemberFunc()<<endl;return 0;
}

运行结果:

四. bind小结

  (1)bind 预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的。
  (2)对于不事先绑定的参数,需要传 std::placeholders 进去,从_1 开始,依次递增。placeholder 是 pass-by-reference 的。
  (3)bind 的返回值是可调用实体,可以直接赋给 std::function 对象。
  (4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前, 这些参数是可用的。
  (5)类的 this 可以通过对象或者指针来绑定。

五. 多态之bind+function

  function 本是不可以包装类成员函数,但是 bind 的可以实现类成员函数的绑定, 然后赋给 fucntion 对象,亦即实现了间接性的包装。
  bind+function 可以实现接口统一的极大整合,这是多态吗?

例4:

附例4代码:

//小问学编程
#include <iostream>
#include <functional>
using namespace std;void foo()
{cout<<"void foo()"<<endl;
}
void func(int a)
{cout<<"void func(int a)"<<endl;
}
class Foo
{public:void method(){cout<<"Foo::void method()"<<endl;}void method2(string s){cout<<"Foo:void method2()"<<endl;}
};
class Bar
{public:void method3(int a,string s){cout<<"Bar:void method3()"<<endl;}
};
function<void(void)> f;int main()
{f = bind(foo);f();f= bind(func,1);f();Foo foo;f = bind(&Foo::method,&foo);f();f = bind(&Foo::method2,&foo,"china");f();Bar bar;f = bind(&Bar::method3,&bar,10,"china");f();return 0;
}

C++新特性探究(十五):bind相关推荐

  1. C++新特性探究(十四):function

    相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...

  2. C++新特性探究(十六):move constructor移动构造

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  3. C++新特性探究(十):Lambda

    一. 匿名函数   简短函数,就地书写,调用.即Lambda存在的意义,常用于取代作回调用的简短函数指针与仿函数.   就地书写,因只有函数体,即无函数名,也称匿名函数. 格式 最小的 Lambda: ...

  4. Java 8新特性探究(五)重复注解(repeating annotations)

    2019独角兽企业重金招聘Python工程师标准>>> 知识回顾 前面介绍了: lambda表达式和默认方法 (JEP 126) 批量数据操作(JEP 107) 类型注解(JEP 1 ...

  5. C++新特性探究(十八):智能指针

    一.智能指针及RAII 问题:   C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题. C++的解决办法:RAII    ...

  6. C++新特性探究(十二):static_assert(提前判误)

    相关博文:C++之异常处理探究 相关博文:assert.if else.try catch三者的区别 相关博文:C++之assert.NDEBUG探究 相关博文:static_assert和asser ...

  7. C++新特性探究(13.6):右值引用再探究

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  8. C++新特性探究(13.5):右值引用

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  9. C++新特性探究(十三):右值引用(r-value ref)探究

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

最新文章

  1. SQL_Case When 嵌套
  2. 二十世纪最伟大的10大算法
  3. 麦肯锡:企业数字化转型不要被技术“绑架”
  4. 鼠标一点打开几个网页
  5. nginx负载均衡的session共享问题的解决方法
  6. 继承jpanel不显示_房产继承全指南
  7. java sum_java math.sum
  8. 机器学习-吴恩达-正规方程多变量回归公式
  9. sas python接口_全方位比较3种数据科学工具:Python、R和SAS(附链接)
  10. 深入解析Invoke and BeginInvoke, 同步与异步解析
  11. 内网通 文件存服务器吗,内网通的服务器地址怎么看
  12. mysql导出表_Navicat for MySQL如何导出数据表
  13. 12月10日 - 最新一大波迅雷看看白金迅雷钻石·VIP7的会员帐号来袭
  14. 计算机基础和办公软件应用第23集,计算机基础及Office办公软件应用(Windows7+0ffice 2010版)...
  15. 蓝牙相关学习:5.BLE协议属性协议层(ATT)
  16. Strong-Convexity
  17. 农场经营区块链游戏-CropBytes,扮演角色经营你的农场
  18. S3DIS数据集的几个bug
  19. HTML5新特性小结
  20. Python3爬取国家统计局官网2017年全国所有城市县镇数据

热门文章

  1. windows7中安装jdk1.8
  2. python入门第二章房贷计算器 打印五子棋棋盘 猜数字 计数器 逢七拍手游戏
  3. 广东中国科学院计算机网络信息中心,中国科学院
  4. bzoj4503: 两个串
  5. [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理
  6. 2018江苏冬令营5 交换矩阵
  7. HTML 最常用的标记
  8. 安装配置rsync服务端
  9. 老子《道德经》第六章
  10. Linux下Birt、JTreeChart中文乱码问题解决办法