C++11 bind的初步了解

bind是一个C++11的一个标准库函数,它的定义在functional中。可以将bind看作一个通用的函数适配器,他接受一个可调用的对象,生成一个新的可调用对象来‘适应对象参数列表。

调用bind的一般形式为:

   auto newCallable = bind(callale,arg_list);

其中,newCallable本身是一个可调用的对象,arg_list是一个逗号分割的参数列表,对应给定的callable的参数。即,当我们调用newCallalbe的时候,会调用callable,并传递给它arg_list中的参数。


  而arg_list中的参数可能保护形式如_n的名字,其中n是一个整数。这些参数是“占位符“,表示newCallable,他们占据了传递给newCallable的参数的位置。数值n表示生成的可调用对象中的参数位置:_1为newCallable的第一个参数,_2为第二个以此类推。


说这么多可能你获取有些迷惑,不急我们来看看几段简单的代码演示,然后再返回来看看说明,一切你就懂了。


#include <iostream>
using namespace std;

#include <functional>//使用bind引用的头文件
using namespace placeholders;//使用bind命名空间


void fun(int a=0,int b=0,int c=0,int d=0,int e=0)
{
    cout<<"a="<<a<<endl
        <<"b="<<b<<endl
        <<"c="<<c<<endl
        <<"d="<<d<<endl
        <<"e="<<e<<endl
        <<"a+b+c+d+e="<<a+b+c+d+e<<endl;
}

void main(void)
{
    int a=1,
        b=2,
        c=3,
        d=4,
        e=5;

    auto g2=bind(fun,a,b,_1,d,_2);  
    //bind的第一个参数为要绑定的函数,后面的参数个数为被绑定函数本身参数的个数
    g2(6,c,e);
    //g2的映射关系为fun(a,b,6,d,c);由于bind参数_1,和_2的限定,g2里面的e没有得到映射。

    /*
    输出结果:
    a=1
    b=2
    c=6
    d=4
    e=3
    a+b+c+d+e=16
    */

    g2(c,e,6,7);
    //g2的映射关系为fun(a,b,c,d,e);由于bind参数_1,和_2的限定,g2里面的6,7没有得到映射。
   
     /*
    输出结果:
    a=1
    b=2
    c=3
    d=4
    e=5
    a+b+c+d+e=15
    */

    auto g1=bind(fun,a,b,_2,d,_1);
    g1(c,e);
    //将bind里的_1和_2对调,g1的映射为fun(a,b,e,d,c);

     /*
    输出结果:
    a=1
    b=2
    c=5
    d=4
    e=3
    a+b+c+d+e=15
    */
     
    auto lab=[](char i,char k)
    {
        cout<<"i="<<i<<endl
            <<"k="<<k<<endl;  
    };

     auto g3=bind(lab,_5,_3);
     g3('a','b','c','d','e');
      /*
    输出结果:
    i=e
    k=c
    */

     auto g4=bind(lab,_2,_4);
     g4('a','b','c','d','e');
    /*
    输出结果:
    i=b
    k=d
    */ 

    system("pause");
}




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。