相关博文: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. Packet for query is too large (1166 1024). You can change this value
  2. 天使投资家李镇樟:如何培养世界级企业家
  3. linux删除git账号密码忘记了,linux清除git账号密码
  4. linux truncate文件,linux系统编程:用truncate调整文件大小
  5. linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏
  6. SpringBoot 多环境配置
  7. netpref 使用_使用PrefView监测.NET程序性能(一):Event Trace for Windows
  8. ASP.NET MVC 2 正式发布
  9. python 基础知识复习巩固
  10. 网吧计费系统数据库修复/网吧收银系统数据库恢复
  11. 超简单的jquery 点击文本复制文本
  12. Java 使用OpenCV进行颜色识别
  13. 华为鸿蒙星星之火,星星之火 数码视讯支持华为鸿蒙发布会全球直播
  14. 新人学习java导论
  15. 【实践案例分享】美团配送A/B评估体系建设与实践
  16. Sparkling Logic SMARTS 实时决策分析模块介绍
  17. 怎么把做好的网页用deramweaver传上互联网 空间和域名怎么申请
  18. L1 操作系统的启动
  19. oracle餐厅网络点餐系统_点餐系统产品演示
  20. 013. 跟郑军老师再聊科幻

热门文章

  1. Fragment学习1--生命周期
  2. 计算机音乐创作是什么,2021计算机音乐创作的作曲方式探究论文
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的个人博客系统
  4. java请求报错(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)
  5. java getconstructors,java 反射 constructors的问题,真心需要解决
  6. 《小团团团队》第四次作业:项目需求调研与分析
  7. shell 脚本 简易for循环 脚本
  8. new image()
  9. 检测子字符串是否存在于字符串或者变量是否存在于数组中
  10. Session和Cookie的学习笔记2