std::tr1::bind和std::tr1::function的用法
除了std::tr1::bind,另外有一个boost::bind,这个应该与boost中其他的数据结构结合的很紧。后者好像用的更多。(boost::function和boost::bind已经纳入了std::tr1,所以这两者应该是一样的)
bind使用形式
bind(&f)() 假设f是一个全局函数,绑定全局函数并调用
bind (&A::f, A())() 假设A是一个构造函数为空的类,这个形式绑定了类的成员函数,故第二个参数需要传入一个成员。(成员静态函数除外)
bind (&A::f, _1)(new A()) 同上,效果是一样的,但是使用了占位符,使得没有固定的的对象,推荐
绑定带返回值的简单使用例子
#include <stdio.h> #include <tr1/functional> using std::tr1::function; using std::tr1::bind; int func(int x,int y) { printf("nimei x:%d y:%d\n", x, y); return 3; } int main() { printf("%d\n", bind<int>(&func, 3, 4)()); return 0; }
使用的时候一定要注意指向的是没有this指针的函数(全局函数或静态成员函数),还是有this指针的函数。后面一种必须要用bind()函数。而且要多一个参数
bind(F f, T1 t1, T2 t2, ..., TN tN);
具体为:
bind(&要调用的函数,&对象, 要调用函数的参数1,要调用函数的参数2...,_1(bind函数的参数1),_2(bind函数的参数2)...)
如果bind的是一个非静态成员函数,第二个参数一定是一个该成员的一个指针,后面才是正常的参数。
bind中,如果有占位符,那么bind返回的就是相应的参数的函数。比如_1 代表的是int型的参数,那么bind返回的就是void (int),假设绑定的时候返回值为void
如果在一个pool中使用bind,那么相应的函数实现可以在其他地方实现而不在pool类中实现,而在其他类中实现,这样可以保持pool的简洁性。
注:
1.typedef function<void(FrameworkPtr)> FrameworkFunc 这个定义代表FrameworkFunc是一个有一个FrameworkPtr为参数,无返回的函数。
2.“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。
3 如果没有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为”(myan语),简直就无敌了。