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内容较多,后面会仔更分析。
- function object研究之四
- function object研究之二
- function object研究之三
- function object研究之五
- function object研究之六 bind example
- function object研究之九 visit_each
- function object研究之八 add_value_*
- function object研究之七 is_placeholder
- function object研究之十 storageN
- function object研究之十一 addressof
- function object研究之十二 reference_wrapper
- function object研究之十三 result_traits
- function object研究之十四 unwrap
- function object研究之十五 list1分析
- function object研究之十六 listN分析
- function object研究之十七 list_av_N
- function object研究之十八 bind_t
- function object研究之十九 bind
- 读书笔记_windows下的混合钩子(HOOK)_part 2
- SQL中JOIN和UNION区别、用法及示例
- NDK开发中利用Logcat调试JNI
- cvs add: added independently by second party 问题解决
- 在VPS上安装cPanel主机控制面板
- function object研究之四
- Facebook是如何开发软件的
- Windows下Apache与Tomcat的整合
- 解决了/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found的问题
- android 平台下免费的 3D/2D 开源项目
- 操作系统的理解
- QT小例子GUI(主)线程与子线程之间的通信
- Zend Framework 多模块 MVC---留言板
- 数据库索引学习——科学建立索引,提高查询速度