std::tr1::bind使用帮助

头文件

#include

语法糖

#define BIND(func, inst) std::tr1::bind(func, inst, std::tr1::placeholders::_1)
#define BIND2(func, inst) std::tr1::bind(func, inst, std::tr1::placeholders::_1, std::tr1::placeholders::_2)

介绍

除了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
#include

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(&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 FrameworkFunc 这个定义代表FrameworkFunc是一个有一个FrameworkPtr为参数,无返回的函数。
2.“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。
3 如果没有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为”(myan语),简直就无敌了。

你可能感兴趣的:(c++)