将函数指针封装成function object
在前面介绍了function object是STL算法的主要使用方式。如果能将现有的函数指针,函数,成员函数等等都封装成function object,就可以获得STL算法的支持,而且可以减少专门编写function object的工作量。基本思路仍然是构造一个function object,内部能够转调函数指针。
bool foo(int x){
return x>=2;
}
typedef bool (*foo_pointer)(int x);
template<typename pointer_type,typename arg_type,typename return_type>
class pointer_bind{
public:
explicit pointer_bind(pointer_type p):p_(p){
}
return_type operator()(arg_type param){
return (*p_)(param);
}
private:
pointer_type p_;
};
int main(int argc, char** argv) {
foo_pointer p = foo;
cout<<(*p)(3)<<endl;
pointer_bind<foo_pointer,int,bool> binder(p);
cout<<binder(4)<<endl;
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::iterator itor = std::find_if(v.begin(),v.end(),binder);
cout<<*itor<<endl;
return 0;
}
上面的pointer_bind非常的初级,但是已经可以工作了。我可以用它构造一个function object,直接调用或者传递给find_if函数作为查询条件。
boost::bind来封装函数指针
写到这里,主角登场。boost提供了一系列bind函数,可以将函数指针,成员函数,函数对象,虚函数,函数引用都封装在一个临时function object内。并且能够支持多达9个参数,同时还能智能的分析出返回类型。
int main(int argc, char** argv) {
foo_pointer p = foo;
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::iterator itor = std::find_if(v.begin(),v.end(),boost::bind(p,_1));
cout<<*itor<<endl;
return 0;
}
boost::bind(p,_1)诡异而简单的写法。_1是指第一个参数,不需要告知参数类型和返回类型,boost::bind能够自动推断出来。boost::bind内容较多,后面会仔更分析。