[C++] 使用'class'或'typename'作為模板參數?


Answers

根據Scott Myers,Effective C ++(第三版)第42項(當然必須是最終答案) - 區別是“沒有”。

如果預期的話,建議是使用“類”,如果預期其他類型(int,char * whatever),T將永遠是一個類,帶有“typename”。 考慮一下使用提示。

Question

可能重複:
模板中關鍵字'typename'和'class'的C ++差異

在C ++中定義函數模板或類模板時,可以這樣寫:

template <class T> ...

或者可以這樣寫:

template <typename T> ...

是否有更好的理由相對於另一方偏好?

我接受了最流行的(和有趣的)答案,但真正的答案似乎是“不,沒有理由相互選擇一個。”

  • 它們是相同的(除非如下所述)。
  • 有些人有理由總是使用typename
  • 有些人有理由總是使用class
  • 有些人有理由使用兩者。
  • 有些人不關心他們使用哪一個。

但是,請注意,對於模板模板參數,需要使用class而不是typename 。 請參閱下面的user1428839的答案 。 (但這個特殊情況並不是偏好問題,而是語言的一個要求。)(這也會隨著c++17變化而變化)




我更喜歡使用typename,因為我不是超載關鍵字的粉絲(jeez - static對各種不同的上下文有多少不同的含義?)。




擴展DarenW的評論。

一旦typename和class不被接受是非常不同的,嚴格使用它們可能仍然有效。 僅當類是真的類時才使用類,而當它的基本類型(如char)時使用類名。

這些類型確實也被接受而不是typename

模板< char myc ='/'>

在這種情況下甚至會優於typename或class。

想想“hintfullness”或其他人的可理解性。 並且實際上認為第三方軟件/腳本可能會嘗試使用代碼/信息來猜測模板發生了什麼(請考慮swig)。




它根本不重要,但是班級使它看起來像T只能是一個班級,當然它可以是任何類型。 所以typename更準確。 另一方面,大多數人使用類,所以一般來說可能更容易閱讀。




為了回應Mike B ,我更喜歡使用'class',因為在模板中,'typename'具有重載意義,但'class'不具有重載意義。 以此檢查的整數類型為例:

template <class IntegerType>
class smart_integer {
public: 
    typedef integer_traits<Integer> traits;
    IntegerType operator+=(IntegerType value){
        typedef typename traits::larger_integer_t larger_t;
        larger_t interm = larger_t(myValue) + larger_t(value); 
        if(interm > traits::max() || interm < traits::min())
            throw overflow();
        myValue = IntegerType(interm);
    }
}

larger_integer_t是一個依賴名稱,所以它需要在其larger_integer_t “typename”,以便解析器可以識別出larger_integer_t是一個類型。 另一方面, 沒有這樣的超載意義。

那......或者我只是懶惰的內心。 我比'typename'更頻繁地輸入'class',因此更容易輸入。 或者這可能表明我寫了太多的OO代碼。