Почему unary_function, binary_function были удалены из C ++ 11?

я нашел это binary_function удаляется из C ++ 11. Мне интересно, почему.

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

Как мы можем улучшить это в C ++ 11 без unary_function?

10

Решение

Он не удален, просто устарел в C ++ 11. Это все еще часть стандарта C ++ 11. Вы все еще можете использовать его в своем собственном коде. (Изменить: комитет недавно проголосовал за удаление его из C ++ 17, хотя.)

Это не использовать в стандарте больше, потому что требует реализации для получения из binary_function переоценка.

Пользователи не должны заботиться о том, less происходит от binary_function, им нужно только позаботиться о том, чтобы это first_argument_type, second_argument_type а также result_type, Должно быть до реализации, как это обеспечивает те typedefs.

Принуждение реализации к производному от определенного типа означает, что пользователи могут начать полагаться на этот вывод, что не имеет смысла и бесполезно.

редактировать

Как мы можем улучшить это в C ++ 11 без unary_function?

Тебе это не нужно.

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обобщенный отрицатель

13

Другие решения

С помощью шаблонов с переменным числом много общего составления функций можно выразить намного проще и последовательнее, так что все старые лодыри больше не нужны:

Использовать

  • std::function
  • std::bind
  • std::mem_fn
  • std::result_of
  • лямбды

Не используйте:

  • std::unary_function, std::binary_function
  • std::mem_fun
  • std::bind1st, std::bind2nd
17

По вопросам рекламы [email protected]