根据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
传递给没有类型参数的算法,这可能会变得毛茸茸。
这仅仅是出于历史原因,因为早期的编译器(据说)不能很好地支持成员函数模板(或者甚至根本不支持),或者是否有更深刻的东西?
答案 0 :(得分:27)
这是由实例化模板创建的类具有嵌套的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
,后者生成这些typedef。例如,您可以使用std::less<T>::result_type
提取结果类型。
现在,对于C ++ 11的decltype
和auto
关键字来说,这几乎是不必要的。
答案 1 :(得分:9)
这就是我们在C ++ 98中做到的方式。现在我们更好地理解模板和转发(有14年的经验),更新的函数类型就是你所说的:函数调用操作符是模板函数。
答案 2 :(得分:1)
Stephan在上次会议上接受了改变这个以使所有这些函数对象在operator()
中具有多态性的提议,这是我的理解。
所以问题的答案是“为什么函数调用操作符没有模板?”,就是它。