function object研究之四

本文介绍如何将函数指针封装为functionobject,以便更好地利用STL算法。通过自定义的pointer_bind类和boost::bind函数实现封装,使得普通函数能够作为算法的参数使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将函数指针封装成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、付费专栏及课程。

余额充值