Ответ 1
Во-первых, мой совет - смотреть CppCon 2015: Стефан Т. Лававей "Функционал: что нового и правильное использование" . std::binary_function
упоминается на слайде 36, примерно на 36 минут в видео. Вы можете найти слайды в github.com/CppCon/CppCon2015). Не стоит вдаваться в подробности, почему вы не должны использовать std::binary_function
, но если вы используете то, что было устарело с С++ 11, вам, вероятно, будет полезно наблюдать за ним.
Если вы хотите фактическое обоснование не использовать его, попробуйте n4190:
unary_function/binary_function были полезными помощниками, когда С++ 98-эра адаптерам нужен параметр argument_type/etc. Определения типов. Такие typedefs ненужное заданное С++ 11 совершенная пересылка, decltype и т.д. (И они неприменимы для перегрузки/шаблона вызова функции операторов.) Даже если класс хочет предоставить эти typedefs для обратной совместимости, он может сделать это напрямую (при незначительных затратах в многословие) вместо наследования от unary_function/binary_function, это то, что сам Стандарт начал делать, когда эти помощники устарели.
Теперь вам это просто не нужно, поэтому вы можете удалить все его следы из своей программы.
В С++ 14 были добавлены прозрачные компараторы. Но он может быть реализован в С++ 11. Просто выделите его для void
:
template<>
struct absoluteLess<void> {
template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const
-> decltype(absolute(std::forward<T>(lhs)) < absolute(std::forward<U>(rhs)))
{
return absolute(std::forward<T>(lhs)) < absolute(std::forward<U>(rhs));
}
}
};
Теперь тип можно вывести:
std::max_element(v.begin(), v.end(), absoluteLess<>());