c++ - 为什么 std::less 是类模板?

标签 c++ templates stl operator-overloading generic-programming

根据 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到没有类型参数的算法,这可能会变得很麻烦。

这只是出于历史原因,因为早期的编译器(据说)不能很好地支持成员函数模板(甚至可能根本不支持),还是有更深刻的原因?

最佳答案

因此,由实例化模板创建的类具有嵌套的 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 ,它产生这些类型定义。例如,您可以使用 std::less<T>::result_type 提取结果类型。 .

如今,对于 C++11 的 decltype,这几乎是不必要的。和 auto关键字。

关于c++ - 为什么 std::less 是类模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867996/

相关文章:

c++ - 下沉的 DWebBrowserEvents2 事件似乎挂起编程导航

c++ - 如何在某个时间以毫秒为单位休眠 posix pthread?

c++ - STL拷贝效率

c++ - 在 C++ 映射中,有没有办法在给定值的情况下搜索键?

c++ - 为自定义 vector 类重载运算符[]

c++ - 当仅提供一些模板参数时,C++编译器如何推断模板参数

c++ - 在不更改成员范围的情况下有条件地启用静态成员

c++ - 具有推导类模板特化类型的变量声明符中的冗余括号

c++ - boost::filesystem::path::append(通过迭代器)导致编译器错误

c++ - 为什么bitset要用template来实现?