簡體   English   中英

為什么std :: less是一個類模板?

[英]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的decltypeauto關鍵字來說,這幾乎是不必要的。

這就是我們在C ++ 98中做到的方式。 現在我們更好地理解模板和轉發(有14年的經驗),更新的函數類型就是你所說的:函數調用操作符是模板函數。

Stephan提出的改變這一點的建議,以便所有這些函數對象在他們的operator()都是多態的,在前一次會議上被接受,是我的理解。

所以問題的答案是“為什么函數調用操作符沒有模板?”,就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM