函数配接器

函数配接器

bind1st(op,value) ----> op(value,param)     //绑定op的第一个参数

bind2st(op,value) ----> op(param,value)

not1(op) ---->!op(param)

not2(op) ---->!op(param1,param2)

注:其中的bind相关参考boost库中bind内容

 

int func1(int p1,int p2 ){

    

    cout<<"p1 = "<<p1<<endl;

    cout<<"p2 = "<<p2<<endl;

    cout<<"result = "<<p1+p2<<endl;



    return p1+p2;

}



int main(int argc, char* argv[])

{

    bind1st(ptr_fun(func1),2)(3);

    return 0;

}

这是一个使用示例,看到其中有个ptr_fun,这是干嘛的呢?

ptr_fun即是针对一般函数设计的函数配接器;

另有

mem_fun_ref(op)   :针对某对象的一个const成员函数

mem_fun(op)  :针对某函数指针的一个const成员函数

 

 

  //在vs2012上编译通过,vc6.0编译失败

#include "stdafx.h"

#include <vector>

#include <iostream>

#include <algorithm>

#include <functional>



using namespace std;





int func1(int p1,int p2 ){



    cout<<"p1 = "<<p1<<endl;

    cout<<"p2 = "<<p2<<endl;

    cout<<"result = "<<p1+p2<<endl;



    return p1+p2;

}



class Myclass{

public:

    int func1( ){

        cout<<"func1 no param"<<endl;        

        return 0;

    }



    int func2(int i){

        cout<<"func2 param = "<<i<<endl; 

        return 0;

    }

};



int main(int argc, char* argv[])

{

    cout<<"测试普通函数配接器"<<endl;

    bind1st(ptr_fun(func1),2)(3);



    vector<Myclass> ovec;

    Myclass o1 = Myclass(); ovec.push_back(o1);

    Myclass o2 = Myclass(); ovec.push_back(o2);

    Myclass o3 = Myclass(); ovec.push_back(o3);

    cout<<"测试成员函数配接器(不带参数)"<<endl;

    for_each(ovec.begin(),ovec.end(),mem_fun_ref(&Myclass::func1));

    cout<<"测试成员函数配接器(带参数)"<<endl;

    for_each(ovec.begin(),ovec.end(),bind2nd(mem_fun_ref(&Myclass::func2),2));



    vector<Myclass * > pvec;

    Myclass *po1 =new Myclass(); pvec.push_back(po1);

    Myclass *po2 =new Myclass(); pvec.push_back(po2);

    Myclass *po3 =new Myclass(); pvec.push_back(po3);

    cout<<"测试对象指针成员函数配接器(不带参数)"<<endl;

    for_each(pvec.begin(),pvec.end(),mem_fun(&Myclass::func1));

    cout<<"测试对象指针成员函数配接器(带参数)"<<endl;

    for_each(pvec.begin(),pvec.end(),bind2nd(mem_fun(&Myclass::func2),2));



    getchar();

    return 0;

}

 

  注意点: 在带一个参数的成员函数绑定时用的是bind2nd,查过资料后知道了原因:第一个参数就相当于this指针了,绑定第二个参数就是绑定成员函数第一个参数

 

你可能感兴趣的:(函数)