我们需要unary_function和binary_function做什么?

pen*_*uru 12 c++ stl

我阅读了有关二进制和一元函数的教程.我理解它们的结构,但我无法想象在哪种情况下我需要这些功能.你能给出一个使用它们的例子吗?

http://www.cplusplus.com/reference/std/functional/unary_function/

http://www.cplusplus.com/reference/std/functional/binary_function/

Arm*_*yan 13

这些不是函数,这些是类(结构,实际上,但无关紧要).当您定义自己的二进制函数以与STL算法一起使用时,可以从这些类派生它们以自动获取所有typedef.

例如

struct SomeFancyUnaryFunction: public std::unary_function<Arg_t, Result_t>
{
   Result_t operator ()(Arg_t const &)
   {
      ...
   }
};
Run Code Online (Sandbox Code Playgroud)

现在你不需要手动提供的类型定义argument_type,result_type等等.这些结构,就像iterator结构在那里只是为了我们的方便,为了重复使用需要算法的类型定义.

C++ 11更新:

从C++ 11开始,新版本std::bind并不需要任何typedef,因此在某种程度上已经过时了.


sbi*_*sbi 7

基本上,它们提供了typedef允许使用函数适配器从一元和二元函数对象组成高阶函数所需的所有必要条件.例如,这允许使用二元仿函数,其中需要一元,将一个参数绑定到文字值:

std::find_if( begin, end, std::bind1st(greater<int>(),42) );
Run Code Online (Sandbox Code Playgroud)

std::bind1st 依赖于传递给它的仿函数来提供这些类型.

新的AFAIK std::bind不需要它们,因此在新代码中你可以使用它std::bind并取消它们.


Dan*_*röm 6

有关函数对象的sgi STL文档的解释.总之,unary_function和binary_function用于使functor 适应.这允许它们与函数对象适配器一起使用,例如unary_negate.