binary_function函数用法

本文介绍如何使用C++中的Functor和Adapter模式来简化代码编写。重点讲解了如何通过自定义适配器使二元Functor能够适用于仅接收单一参数的算法,并介绍了STL中的`std::binder2nd`如何帮助实现这一过程。

转自:http://blog.youkuaiyun.com/mydriverc2/article/details/11554345

大多数情况,不需要用到binary_function! 

如果你在定义一个二元的functor时,几乎可以不用管这个binary_function。但是如果你使用一些function adapter的时候就需要了,这其实是在实现一种concept. 

比如,定义一个functor,用来给一个vector <double> push_back一个值

C/C++ code

struct inserter { publicvoid operator()(double n, vector<double> & v) { v.push_back(n); } }; inserter f; vector<dobule> vd; f(1.0, vd);

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

C/C++ code

template<typename Functor> void append(Functor f) { double x; while(cin>>x) f(x); }


这时,你的insert就用不上了,因为append的functor只要求一个参数。如果你的inserter本来是一个很复杂的操作,那么如果重写一个就很麻烦。不过有一个简单的办法是再定义一个inserter_adapter

C/C++ code

template<typename Functor> struct inserter_adapter { inserter_adapter(const Functor& f, vector<double>& v) :f_(f), v_(v) {} voidoperator()(double x) { f_(x, v_); } Functor f_; vector<double>& v_; };

那么在使用的时候就是下面这样。

C/C++ code

inserter f; vector<dobule> vd; inserter_adapter ia(f, vd); append(ia);


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

但是前面定义的inserter这个函数对象不能直接用在std::binder2nd上,它还不符合std::binder2nd的concept。继承一下binary_function就搞定了。

C/C++ code

struct inserter :public std::binary_function<double, vector<double>&void> //分别是第一个参数,第二个参数,返回值类型 publicvoidoperator()(double n, vector<double> & v) { v.push_back(n); } }; inserter f; vector<dobule> vd; inserter_adapter ia(f, vd); append(std::bind2nd(f, vd)); //bind2nd帮你创建了一个binder2nd对象



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

### 解决方案 在处理QCAD中的`binary_function is not a member of std`错误时,主要问题是C++标准库的变化。自C++11以来,许多功能被移至其他头文件或完全移除。具体来说,在C++17中,`std::binary_function`已被弃用并最终从C++20中移除。 为了修复这个错误,可以采取以下方法: #### 方法一:更新代码以适应新版本的标准库 如果项目依赖于旧版C++特性,则应考虑将这些部分替换为现代替代品。对于`std::binary_function`,可以直接定义自己的函数对象类来代替它[^1]。 ```cpp // 替代 std::binary_function 的方式 struct MyBinaryFunction { template<typename T, typename U> struct result; template<typename T, typename U> struct result<MyBinaryFunction(T,U)> { typedef int type; }; int operator()(int x, int y) const { return x + y; } }; ``` #### 方法二:回退到较早的C++标准 另一种选择是在编译器设置中指定较低级别的C++标准(如C++98),但这通常不推荐,因为这会限制对最新特性的访问,并可能导致未来维护困难。 #### 方法三:引入第三方库 还可以通过引入Boost等外部库来继续使用已废弃的功能。然而,这种方法增加了项目的复杂性和依赖关系管理难度。 考虑到上述情况,建议采用第一种方法——即升级现有代码以符合当前C++标准的要求。这样不仅可以解决问题本身,还能使整个工程受益于更现代化的语言特性和支持更好的性能优化[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值