C++11 bind函数
来源:互联网 发布:数据的预处理 编辑:程序博客网 时间:2024/06/15 19:45
bind标准库函数,定义在头文件functional中。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
调用bind的一般形式为:
auto newCallable = bind(callable,arg_list);
其中,newCallable是一个可调用对象,arg_list是逗号分隔的参数列表,对应callable的参数。当我们调用newCallable时,newCallable会调用callable,并传递arg_list中的参数。
arg_list中可能会包含形如_n的参数,n是一个整数,这些参数是占位符,表示newCallable的参数占据传递给newCallable的参数的位置。_1为newCallable的第一个参数,_2为newCallable的第二个参数,以此类推。
_n在placeholders命名空间内,需要使用usingnamespace std::placeholders;
可以用bind绑定给定的可调用对象的参数或调整其参数顺序。比如f是一个有5个参数的可调用对象,auto g = bind(f, a, b, _2, c, _1); 调用g时,第一个参数传递给f做第五个参数,第二个参数传递给f做第三个参数。
默认情况下,bind中不是占位符的参数被拷贝到bind返回的可调用对象中。但是,有时候有些参数要以引用方式传递或者参数类型不允许拷贝,比如ostream对象。这时就需要用ref标准库函数,ref函数返回一个对象,包含指定的引用,该对象是可拷贝的。
#include < functional>using namespace std;using namespace std::placeholders;int Func(int x, int y);auto bf1 = bind(Func, 10, _1);bf1(20); // same as Func(10, 20) class A{public: int Func(int x, int y);}; A a;auto bf2 = bind(&A::Func, a, _1, _2);bf2(10, 20); // same as a.Func(10, 20) function< int(int)> bf3 = bind(&A::Func, a, _1, 100);bf3(10); // same as a.Func(10, 100)
上面的例子中,bf1是把一个两个参数普通函数的第一个参数绑定为10,生成了一个新的一个参数的可调用实体; bf2是把一个类成员函数绑定了类对象,生成了一个像普通函数一样的新的可调用实体; bf3是把类成员函数绑定了类对象和第二个参数,生成了一个新的function对象。使用bind需要注意的一些事项:
•(1)bind预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的
•(2)对于不事先绑定的参数,需要传占位符进去,从_1开始,依次递增。placeholder是pass-by-reference的
•(3)bind的返回值是可调用实体,可以直接赋给std::function对象
•(4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前,这些参数是可用的
•(5)类的this可以通过对象或者指针来绑定
bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体。C++98中,有两个函数bind1st和bind2nd,它们分别可以用来绑定functor的第一个和第二个参数,它们都是只可以绑定一个参数。各种限制,使得bind1st和bind2nd的可用性大大降低。C++0x中,提供了std::bind,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制,由用户指定,这个bind才是真正意义上的绑定,有了它,bind1st和bind2nd就没啥用武之地了,因此C++0x中不推荐使用bind1st和bind2nd了,都是deprecated了。
- C++bind函数
- C++11 bind函数
- c++:使用function模板和bind函数
- bind函数
- bind函数
- bind()函数
- bind函数
- bind函数
- C++bind
- Socket编程(C语言实现):bind()函数英文翻译
- [C++] 通用算法、函数对象、lambda表达式、bind
- c++11学习笔记之bind函数
- C++11 bind函数实现原理图
- Unix Network Programming(11)---bind 函数
- [C++]C++11:Function与Bind
- [C++] C++11 bind 的用法
- 【C/C++】C++11新特性:std::bind
- socket bind函数
- IDEA + Maven + Git 快速开发 Web 应用
- mvn install 报错error in opening zip file
- 搭建Spring开发环境
- jsoup select 通过属性选择器选择内容,索引值选择
- unity3dのレイについての勉強
- C++11 bind函数
- 4.13
- js原生DOM对象与jQuery对象不是一回事儿,区别联系相互转换,踩坑经历
- 小米手机上屏蔽复制粘贴功能
- C# WinForm开发系列之DataGridView部分属性总结和图片资源的引用方式
- React Native 中组件的生命周期
- Linux初级学习之不同系统之间的文件传输 第十二章学习笔记
- python把数组中的数字每行打印3个并保存在文档中
- 摆脱性冷淡字体,这一招你值得拥有