function object研究之四

来源:互联网 发布:大专网络教育 编辑:程序博客网 时间:2024/06/05 12:48

将函数指针封装成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是指第一个参数int x,不需要告知参数类型和返回类型,boost::bind能够自动推断出来。boost::bind内容较多,后面会仔更分析。