function object研究之四

将函数指针封装成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内容较多,后面会仔更分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值