问题描述
我发现 binary_function
已从C ++ 11中删除。我想知道为什么。
I found that binary_function
is removed from C++11. I am wondering why.
C ++ 98:
template <class T> struct less : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const {return x<y;}
};
C ++ 11:
template <class T> struct less {
bool operator() (const T& x, const T& y) const {return x<y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
已修改 ------------- -------------------------------------------------- -------------
MODIFIED----------------------------------------------------------------------------
template<class arg,class result>
struct unary_function
{
typedef arg argument_type;
typedef result result_type;
};
例如,如果我们要为功能编写适配器,甚至在C ++ 98中,
For example, if we want to write our adapter for function even in C++98,
template <class T> struct even : unary_function <T,bool> {
bool operator() (const T& x) const {return 0==x%2;}
};
find_if(bgn,end,even<int>()); //find even number
//adapter
template<typename adaptableFunction >
class unary_negate
{
private:
adaptableFunction fun_;
public:
typedef adaptableFunction::argument_type argument_type;
typedef adaptableFunction::result_type result_type;
unary_negate(const adaptableFunction &f):fun_(f){}
bool operator()(const argument_type&x)
{
return !fun(x);
}
}
find_if(bgn,end, unary_negate< even<int> >(even<int>()) ); //find odd number
在没有 unary_function ?
推荐答案
它并未删除,只是在C ++ 11中已弃用。它仍然是C ++ 11标准的一部分。您仍然可以在自己的代码中使用它。
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.
在标准中不再使用 ,因为要求实现从<$派生c $ c> binary_function 是超规格的。
It isn't used in the standard any more because requiring implementations to derive from binary_function
is over-specification.
用户不必担心是否少
从 binary_function
派生而来,他们只需要注意它定义了 first_argument_type
, second_argument_type
和 result_type
。
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.
编辑
您不需要它。
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
这篇关于为什么从C ++ 11中删除了unary_function,binary_function?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!