1 介绍
一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。
方式一:
直接boost::bind(函数名, 参数1,参数2,…)
方式二:
对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2)
而boost::function也是一种函数对象。
需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同。
2 用法
【bind】
一般用法:bind用于一般普通函数( 以非类、结构的成员函数 )具有多种形式,但用法简单。
用于类、结构的成员函数:bind用于成员函数时必须要在参数列表中指出成员函数在所属的类中的地址,成员函数所属对象,让bind知道此成员函数所属类地址和调用此成员函数的类对象。除了这两点额外的要求后,使用形式跟一般用法一致。
【function】
一般用法:function用于一般函数的情况下,只需要按照一般函数的 “返回值”,“参数列表( 参数列表用括号括起来,彼此用逗号隔开 )”来声明对象,然后指向对应的函数地址(函数名)
用于成员函数:单用function来包装类的成员函数,需要按照函数 “返回值”,“类指针类型和参数列表(类指针型别和餐宿列表在括号中,彼此用逗号隔开)”来声明function对象。在调用被包装的函数时,必须要事先定义一个类对象将其地址传入,与声明function对象时的第一个类指针参数相对应。让function对象知道函数的所属地址及具体调用成员函数类对象。
【bind & function】
不管是针对一般的函数还是针对类成员函数,都不可以使用占位符来作为bind的参数,因为用function调用包装函数的时候会报参数不对应的错误。另外bind的返回一定要是一个函数地址而不是调用函数的形式。
在针对类成员函数的时候,function对象可以不再有类和对象的地址。因为bind已经将二者包装了。
二者的其它用法跟其单独使用时的规则大同小异。
3 代码示例
#include <boost/bind.hpp>
#include<boost/function.hpp>
#include <iostream>
using namespace std;
typedef boost::function<void(int)> Func;
class ctrl_client{
public:
void func(int x, int y) {
cout << x << ", " << y << endl;
}
};
class ctrl_server{
public:
void fun(int x) {
cout << x << ", " << endl;
}
ctrl_client cc;
};
//void (* func)(int a,int b);
int main()
{
//std::for_each(v.begin(), v.end(), boost::bind(add, 10, _1));
//Func f(boost::bind(&fun, 1, _1)(2));
//boost::bind(&fun, 1, _1)(2);
// f();
//fun(9);
//cout << boost::bind(add, _2, _1) <<endl;
ctrl_server ss;
Func f = boost::bind(&ctrl_server::fun,&ss,_1);
f(1);
}
在上面的例子中要个古怪的对象"_1"。这个叫做站位符,他代表这个位置有个参数,但现在还不知道参
数是什么。_1代表参数列表中的第一个位置上的参数。Boost.Bind一共定义了9个站位符对象。如下
_1,_2,_3,_4,_5,_6,_7,_8,_9。分别代表参数列表中位子。