boost::bind总结

    技术2025-03-13  38

    性质:

    不是函数,是一个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)