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语),简直就无敌了。

原文地址:https://www.cnblogs.com/zhangzhang/p/2875920.html