Подтвердить что ты не робот

Почему 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 алгоритму без аргумента типа, который может стать волосатым.

Это просто по историческим причинам, потому что ранние компиляторы (предположительно) не поддерживали шаблоны функций-членов очень хорошо (или, может быть, даже вообще), или есть что-то более глубокое для него?

4b9b3361

Ответ 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(), были приняты на предыдущей встрече, я понимаю.

Итак, ответ на ваш вопрос "почему оператор вызова функции не является шаблоном?", так это.