性质:
不是函数,是一个class,是一个多元仿函数
模板参数:
带模板参数,但不需要,会自动推导!
构造函数参数:
格式:_需要绑定类型,_参数1,_参数2,_参数3,_参数4…
_需要绑定类型:可以是普通函数,类成员函数,成员变量
_参数N:可以是一个占位符,或者实际参数。
如果绑定的类型是一个类成员函数或变量,那么第一个参数必须是对象或者对象指针。
仿函数参数:
任意
仿函数返回值
如果绑定的是函数,返回绑定函数的返回值。
如果绑定是成员变量,返回成员变量值
占位符:
_1,_2,_3,_4….._9
占位符的数字表示仿函数时对应参数的位置。
一个bind里可以嵌入多个bind,但占位符是相对于这一块的bind是共享。
注意事项
Ø 如果绑定的是类函数,传入对象时,最好使用对象指针,如果使用对象实例会产生多次对象复制。如果非要传对象而不想多次被复制传在在使用ref或cref(ref的const版)
Ø 跟lambda混用时一定要特别小心
第一、 会与lambda的占位符有冲突
第二、 lambda库里有跟同样名字的bind,功能类似,但没有此功能强大
总结
无模板参数,构函数对绑定函数负责,仿函数是任意的。
举例说明
例一:
void nine_arguments( int i1,int i2,int i3,int i4, int i5,int i6,int i7,int i8, int i9) { std::cout << i1 << i2 << i3 << i4 << i5 << i6 << i7 << i8 << i9 << '/n'; }
int main() { int i1=1,i2=2,i3=3,i4=4,i5=5,i6=6,i7=7,i8=8,i9=9; (boost::bind(&nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7)) (i1,i2,i3,i4,i5,i6,i7,i8,i9); } |
输出结果921638457
参数传递如下图:
例二:
#include <iostream> #include <vector> #include <algorithm> #include <functional> #include <boost/bind.hpp> #include <boost/foreach.hpp> using namespace std; using namespace boost;
class CMyClass { public: CMyClass():MyValue(0){} void print(int i,const char * szSplit) { cout<<i<<szSplit; } int MyValue; }; int _tmain(int argc, _TCHAR* argv[]) {
CMyClass obj; vector<int> myData(20);
BOOST_FOREACH(int & x,myData) x=rand()%200;
//第一个参数,可以看出对象带不带指针都能正确工作 //第二个参数是占位符 //第三个参数是普通参数 for_each(myData.begin(),myData.end(),bind(&CMyClass::print,obj,_1," | ") ); for_each(myData.begin(),myData.end(),bind(&CMyClass::print, ref(obj),_1," | ") ); for_each(myData.begin(),myData.end(),bind(&CMyClass::print,&obj,_1," * ") );
//bind是多元,不管后面带多少个参数,参数是什么类型,它的构造函数只对绑定函数负责,仿函数是任意的 bind(&CMyClass::print,obj,_2," | ")(99,10091,"dsafsdafsdaf");
int nResult; nResult=bind(minus<int>(),_1,_2)(20,1);//nResult=19
//nResult=a2*10-(a1+a3),尽管输入个参数,但a4一直未参加运算,战占位符在各个bind间是共享 nResult=bind(minus<int>(), bind(multiplies<int>(),_2,10), bind(plus<int>(),_1,_3) )(1,10,2,1000);
//绑定成员变量 obj.MyValue=2000; nResult=bind(&CMyClass::MyValue,_1)(obj);//nResult=2000 return 0; } |