Может быть:
std::multiset<long, std::less<int> > moduloset;
Странная вещь, но дело в том, что std::less<int>
, std::less<long>
, std::less<unsigned int>
реализуют разные математические функции, которые дают разные результаты при передаче (результат преобразования) определенных выражений-аргументов. Различные алгоритмы и другие стандартные библиотечные компоненты работают, задавая функтор, поэтому мне кажется логичным, что существуют разные функторы для представления этих разных математических функций, а не просто разные перегрузки operator()
на одном функторе.
Более того, функтор с шаблоном operator()
не может быть Adaptable Binary Predicate, поскольку у него нет типов аргументов (аргумент может иметь любой тип). Итак, если бы std::less
был определен так, как вы предлагаете, он не мог бы участвовать в вещах в <functional>
.
Также в весьма спекулятивной заметке - std::less
, вероятно, был разработан до того, как поддержка функций-членов шаблона стала широко распространенной, поскольку в документации SGI STL есть различные примечания, в которых говорится: «Если ваша реализация не поддерживает шаблоны-члены, то это не так. т доступен». Для такого простого компонента, я думаю, был бы стимул сделать что-то, что работает сегодня. Когда он существует, стандартизация могла удалить его в пользу чего-то другого, но стоило ли нарушать существующий код? Если бы это было так важно, то либо вы, либо стандарт могли бы ввести функтор flexible_less
, как вы описываете.
Наконец, почему
template<class T>
bool operator()(T const& lhs, T const& rhs){
return lhs < rhs;
}
скорее, чем
template<class T, class U>
bool operator()(T const& lhs, U const& rhs){
return lhs < rhs;
}
Для определяемых пользователем типов эти два значения могут не совпадать. Да, это несправедливый вопрос, так как я не знаю, почему нет версии std::less
с двумя шаблонами-аргументами ;-)
person
Steve Jessop
schedule
04.07.2011
template<class T> std::less<T=void>
сstd::less<void>
, содержащим шаблонoperator<
(и аналогично для другие функторы). - person TemplateRex   schedule 03.08.2014