c++11:std::function和bind

来源:互联网 发布:nosql数据库那个最火 编辑:程序博客网 时间:2024/06/10 18:38

这两个的头文件都是

#include <functional>

std::function

它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳除了类成员(函数)指针之外的所有可调用函数。
以统一的方式处理函数、函数对象、函数指针。允许保存和延迟执行函数。
std::function object最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等

void G();class A{public:void H(){}//看着是无参,其实第一个参数是this指针};void test(A a){}std::function<void()> f = G; //全局函数A a;std::function<void()> f 1= std::bind(&A::H, a); //成员函数,注意,对应类的成员函数这里一定要用&std::function<void()> f_2 = std::bind(test, a);//非成员函数加不加&都可以   /*对于test和&test你应该这样理解,test是函数的首地址,它的类型是void (A a),&test表示一个指向函数test这个对象的地址, 它的类型是void (*)(A a),因此test和&test所代表的地址值是一样的,但类型不一样。test是一个函数,&test表达式的值是一个指针! 跟此问题类似的还有对一个数组名取地址。 int a[100];  //&a[0]指向的是元素a[0]。 数组名a,指向的是具有100个int类型的组数; */std::function<void()> f_3 = [a]()mutable{a.H();};//感觉lambda可以代替bind了

std::bind

bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体

  • 将可调用对象与其参数一起绑定成一个仿函数
  • 将多元(n>1)函数转成一元函数或者(n-1)元函数,即只绑定部分参数
void H(int a);//绑定全局函数auto f11 = std::bind(H, std::placeholders::_1);//auto的类型实际上是std::function<void(int)>//绑定带参数的成员函数std::function<void (char*, int)> f = std::bind(&ReadHandler::ConnectPreProcess, this, std::placeholders::_1, std::placeholders::_2);//三元函数转换成一元函数int f(int, char, double);// 绑定f()函数调用的第二个和第三个参数,// 返回一个新的函数对象为ff,它只带有一个int类型的参数auto ff = bind(f, _1, ‘c’, 1.2);    int x = ff(7); 

注意事项

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

总结

bind通常最有用的就是预先绑定类成员函数的this,但感觉有了lambda表达式bind的这种作用基本可以被替代了。