Why have unary_function, binary_function been removed from C++11?

∥☆過路亽.° 提交于 2019-11-30 05:15:17
Jonathan Wakely

It isn't removed, it's just deprecated in C++11. It's still part of the C++11 standard. You can still use it in your own code. It was removed in C++17 though.

It isn't used in the standard any more because requiring implementations to derive from binary_function is over-specification.

Users should not care whether less derives from binary_function, they only need to care that it defines first_argument_type, second_argument_type and result_type. It should be up to the implementation how it provides those typedefs.

Forcing the implementation to derive from a specific type means that users might start relying on that derivation, which makes no sense and is not useful.

Edit

How can we improve this in c++11 without unary_function?

You don't need it.

template<typename adaptableFunction>
class unary_negate
{
   private:
       adaptableFunction fun_;
   public:
       unary_negate(const adaptableFunction& f):fun_(f){}

       template<typename T>
           auto operator()(const T& x)  -> decltype(!fun_(x))
           {
               return !fun_(x);
           }
}

In fact you can do even better, see not_fn: a generalized negator

With variadic templates, a lot of general function composing can be expressed much more simply and consistently, so all of the old cruft is no longer necessary:

Do use:

  • std::function
  • std::bind
  • std::mem_fn
  • std::result_of
  • lambdas

Don't use:

  • std::unary_function, std::binary_function
  • std::mem_fun
  • std::bind1st, std::bind2nd
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!