函数配接器

函数配接器

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指针了,绑定第二个参数就是绑定成员函数第一个参数

 

posted @ 2015-07-19 20:28  朽木可雕否  阅读(194)  评论(0编辑  收藏  举报