Почему std:: less шаблон шаблона?
Согласно 20.8.5 §1, 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
алгоритму без аргумента типа, который может стать волосатым.
Это просто по историческим причинам, потому что ранние компиляторы (предположительно) не поддерживали шаблоны функций-членов очень хорошо (или, может быть, даже вообще), или есть что-то более глубокое для него?
Ответы
Ответ 1
Это так, что класс, созданный инстанцированным шаблоном, имеет вложенные typedefs, которые предоставляют информацию типа о типе результата и типах аргументов функтора:
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
.
В настоящее время это в основном не нужно с ключевыми словами С++ 11 decltype
и auto
.
Ответ 2
То, как мы это сделали на С++ 98. Теперь, когда мы лучше разбираемся в шаблонах и пересылаем (с 14-летним опытом), новые типы функций выполняют то, что вы сказали: оператор вызова функции является функцией шаблона.
Ответ 3
Предложение Стефана изменить это так, что все такие функциональные объекты являются полиморфными в своих operator()
, были приняты на предыдущей встрече, я понимаю.
Итак, ответ на ваш вопрос "почему оператор вызова функции не является шаблоном?", так это.