[英]Why is std::less a class template?
根據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
,它生成這些typedef。 例如,您可以使用std::less<T>::result_type
提取結果類型。
如今,對於C ++ 11的decltype
和auto
關鍵字來說,這幾乎是不必要的。
這就是我們在C ++ 98中做到的方式。 現在我們更好地理解模板和轉發(有14年的經驗),更新的函數類型就是你所說的:函數調用操作符是模板函數。
Stephan提出的改變這一點的建議,以便所有這些函數對象在他們的operator()
都是多態的,在前一次會議上被接受,是我的理解。
所以問題的答案是“為什么函數調用操作符沒有模板?”,就是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.