Согласно п. 20.8.5, std::less
шаблон класса с функцией-членом:
template<typename T>
struct less
{
bool operator()(const T& x, const T& y) const;
// ...
};
Это означает, что я должен упомянуть тип, когда я создаю экземпляр шаблона, например std::less<int>
, Почему нет std::less
нормальный класс с шаблоном функции-члена вместо?
struct less
{
template<typename T, typename U>
bool operator()(const T& x, const U& y) const;
// ...
};
Тогда я мог бы просто пройти std::less
к алгоритму без аргумента типа, который может стать волосатым.
Это просто по историческим причинам, потому что ранние компиляторы (предположительно) не очень хорошо поддерживали шаблоны функций-членов (или, может быть, даже вообще), или в этом есть что-то более глубокое?
Это так, что класс, созданный созданным экземпляром шаблона, имеет вложенные typedef, которые предоставляют информацию о типе типа результата и аргумента функтора:
template <class Arg1, class Arg2, class Result>
struct binary_function
{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
template <class T>
struct less : binary_function <T,T,bool>
{
bool operator() (const T& x, const T& y) const;
};
std::less
наследуется от std::binary_function
, который производит эти typedefs. Так, например, вы можете извлечь тип результата, используя std::less<T>::result_type
,
В настоящее время это в основном не нужно в C ++ 11 decltype
а также auto
ключевые слова.
Так мы и сделали в C ++ 98. Теперь, когда мы лучше понимаем шаблоны и переадресацию (с 14-летним опытом), новые типы функций выполняют то, что вы сказали: оператор вызова функции является функцией шаблона.
Предложение Стефана изменить это так, чтобы все такие функциональные объекты были полиморфными по своему operator()
был принят на предыдущей встрече, это мое понимание.
Итак, ответ на ваш вопрос «почему оператор вызова функции не является шаблонным?», Таков.