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