boost::bind总结

性质:

不是函数,是一个class,是一个多元仿函数

模板参数:

带模板参数,但不需要,会自动推导!

构造函数参数:

格式:_需要绑定类型,_参数1_参数2_参数3_参数4…

_需要绑定类型:可以是普通函数,类成员函数,成员变量

_参数N:可以是一个占位符,或者实际参数。

如果绑定的类型是一个类成员函数或变量,那么第一个参数必须是对象或者对象指针。

仿函数参数:

任意

仿函数返回值

       如果绑定的是函数,返回绑定函数的返回值。

       如果绑定是成员变量,返回成员变量值

占位符:

_1,_2,_3,_4….._9

占位符的数字表示仿函数时对应参数的位置。

一个bind里可以嵌入多个bind,但占位符是相对于这一块的bind是共享。

注意事项

Ø         如果绑定的是类函数,传入对象时,最好使用对象指针,如果使用对象实例会产生多次对象复制。如果非要传对象而不想多次被复制传在在使用refcref(refconst)

Ø         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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值