从binary_function类继承的作用

来源:互联网 发布:淘宝购物券怎么用 编辑:程序博客网 时间:2024/04/30 05:11
大多数情况,不需要用到binary_function!如果你在定义一个二元的functor时,几乎可以不用管这个binary_function。但是如果你使用一些function adapter的时候就需要了,这其实是在实现一种concept.

比如,定义一个functor,用来给一个vector<double> push_back一个值
C++代码 复制代码
  1. struct inserter   
  2. {   
  3. public:   
  4.     void operator()(double n, vector<double> &v)   
  5.     {   
  6.         v.push_back(n);       
  7.     }   
  8. };   
  9.   
  10. inserter f;   
  11. vector<dobule> vd;   
  12. f(1.0, vd);  

现在,如果有一个算法,会往容器里追加一些值。例如这样

C++代码 复制代码
  1. template<typename Functor>   
  2. void append(Functor f)   
  3. {   
  4.     double x;   
  5.     while(cin>>x)   
  6.         f(x);   
  7. }  
这时,你的insert就用不上了,因为append的functor只要求一个参数。如果你的inserter本来是一个很复杂的操作,那么如果重写一个就很麻烦。不过有一个简单的办法是再定义一个inserter_adapter
C++代码 复制代码
  1. template<typename Functor>   
  2. struct inserter_adapter   
  3. {   
  4.     inserter_adapter(const Functor& f, vector<double>& v)    
  5.         :f_(f), v_(v)   
  6.         {}   
  7.             
  8.     void operator()(double x)   
  9.     {   
  10.         f_(x, v_);       
  11.     }   
  12.   
  13.     Functor f_;   
  14.     vector<double>& v_;   
  15. };  
那么在使用的时候就是下面这样。
C++代码 复制代码
  1. inserter f;   
  2. vector<dobule> vd;   
  3. inserter_adapter ia(f, vd);   
  4.   
  5. append(ia);  

其实使用STL,你完全不用再写一个inserter_adapter,STL中有一个std::bind2nd的function adapter,作用和inserter_adapter一样,是把第二个参数绑定,让二元的函数对象变成一元的,就能符合只需要一个参数的算法。

但是前面定义的inserter这个函数对象不能直接用在std::bind2nd上,它还不符合std::bind2nd的concept。继承一下binary_function就搞定了。
C++代码 复制代码
  1. struct inserter   
  2.     :public std::binary_function<double, vector<double>&, void// 分别是第一个参数,第二个参数,返回值类型   
  3. {   
  4. public:   
  5.     void operator()(double n, vector<double>& v)   
  6.      {   
  7.         v.push_back(n);       
  8.     }   
  9. };   
  10.   
  11. inserter f;   
  12. vector<dobule> vd;   
  13. inserter_adapter ia(f, vd);   
  14.   
  15. append(std::bind2nd(f, vd)); // bind2nd帮你创建了一个binder2nd对象  


其实符合了bind2nd的concept,就意味着bind2nd知道了你的inserter需要什么样的参数类型,这样就可以帮你传递参数到你的inserter里面去了。
原创粉丝点击