19

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

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

4

3 回答 3

28

这样,由实例化模板创建的类具有嵌套的 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.

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

于 2012-12-13T20:36:47.480 回答
9

这就是我们在 C++98 中所做的方式。现在我们对模板和转发有了更好的理解(有 14 年以上的经验),更新的函数类型就如你所说:函数调用运算符是一个模板函数。

于 2012-12-13T20:36:39.000 回答
1

Stephan 提出的改变这一点的提议,以便所有这些函数对象都是多态的,operator()在上次会议上被接受,这是我的理解。

所以你的问题“为什么函数调用运算符没有模板化?”的答案就是它。

于 2012-12-13T21:53:33.093 回答