我发现{C} 11中已删除binary_function
。我想知道为什么。
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;
};
改性 --------------------------------------- -------------------------------------
template<class arg,class result>
struct unary_function
{
typedef arg argument_type;
typedef result result_type;
};
例如,如果我们想在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中改进这一点?
答案 0 :(得分:17)
使用可变参数模板,可以更加简单一致地表达许多通用功能组合,因此不再需要所有旧功能:
使用:
std::function
std::bind
std::mem_fn
std::result_of
不要使用:
std::unary_function
,std::binary_function
std::mem_fun
std::bind1st
,std::bind2nd
答案 1 :(得分:15)
它没有被删除,它只是在C ++ 11中被弃用了。它仍然是C ++ 11标准的一部分。您仍然可以在自己的代码中使用它。它在C ++ 17中删除了。
标准中不再使用,因为要求实现从binary_function
派生是过度规范的。
用户不应关心less
是否来自binary_function
,他们只需要关心它定义first_argument_type
,second_argument_type
和result_type
。它应该取决于它如何提供这些typedef。
强制实现从特定类型派生意味着用户可能开始依赖于该派生,这没有任何意义且无用。
修改强>
如果没有unary_function,我们怎么能在c ++ 11中改进呢?
你不需要它。
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);
}
}
事实上,您可以做得更好,请参阅not_fn
: a generalized negator