function object研究之二
来源:互联网 发布:市政工程bim软件 编辑:程序博客网 时间:2024/06/04 18:29
如何传递引用
<<Effective STL>>提到可以让function object继承自unary_function<T, void>,现在来试一下.
class B : public unary_function<int,void>{public: B():x_(0){ } void operator()(int x){ cout<<++x_<<endl; } int x() const{ return x_; }private: int x_;};int main(int argc, char** argv) { vector<int> v; v.push_back(1); v.push_back(2); A a; for_each(v.begin(),v.end(),a); cout<<a.x()<<endl; cout<<"------------"<<endl; B b; typedef vector<int>::iterator itor_type; for_each<itor_type,B&>(v.begin(),v.end(),b); cout<<b.x()<<endl; return 0;}
现在看看unary_function的源代码,了解一下原理。
template<typename _Arg, typename _Result> struct unary_function { /// @c argument_type is the type of the argument typedef _Arg argument_type; /// @c result_type is the return type typedef _Result result_type; };
这种方法虽然能解决问题,但是需要修改function object的源代码,而且要在使用for_each的时候显式的告知模板参数类型(回顾一下前一篇,for_each是一个模板函数,有两个模板参数),更多时候,我需要一种非侵入式的方式的简洁方式.
我在实际开发中解决方案之一是采用Pimple模式来处理,也就是B对象拥有一个指针p,指向具体的类,在operator()()中执行p->operator()()操作。Effective STL也提到,这样的好处就是还可一支持多态,而且避免在值传递的时候造成的对象切割。下面看看我自己的实现。
自己实现支持引用传递
前面Pimpl模式的解决方案可以给我们一个提示,如果我们有一个模板函数,能够将function object的地址作为指针保存在另一个类里面。这个新类也是一个function object,只不过它的operator()()内部简单转调真正的function object,即可。下面的代码是第一个简易版本。
template<typename function_object_type,typename element_type>class function_object_ref{public: explicit function_object_ref(function_object_type & object):object_(&object){ } void operator()(element_type e){ object_->operator()(e); }private: function_object_type* object_;};int main(int argc, char** argv) { A a2; function_object_ref<A,int> wrapper(a2); for_each(v.begin(),v.end(),wrapper); cout<<a2.x()<<endl; return 0;}
虽然还有提升空间,但是显然已经比unary_function的方案简单多了。
- 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
- WP7永久保存数据方法
- 查明锁表进程并解锁
- 位图排序的操作方法
- effective C++ 条款 1:尽量用const和inline而不用#define
- sng,png,文本格式转换
- function object研究之二
- 无法在Web服务器上启动调试
- 基于Silverlight的新浪微博客户端 - LightBus
- 获得人生中的成功需要的专注与坚持不懈多过天才与机会
- linux 线程 进程经典文章
- libgdx中延迟加载资源文件
- 面对生活和死亡乔布斯有这样一段名言
- word只读密码破解解决办法
- C++实现的委托机制(2)