模板的靜態成員
回答
分配給它的靜態常量成員根據模板參數傳遞的值而變化。縮短到這樣的事情:
template<int X>
struct foo {
static const int value = X;
};
你不會想到foo<10>::value
等於foo<11>::value
你會嗎?這通常用於模板元編程,因爲該靜態常量的值取決於模板參數。
謝謝,把它說得很清楚。 – Twifty
事實上,您定義的模板參數是非類型參數,而不是其他兩種模板參數:類型參數和模板參數。
但是,它們仍然是模板參數,您將爲每個不同的模板參數集獲得全新的數據類型。例如,foo<3,'a'>
是與foo<4,'a'>
不同的數據類型,它又與foo<3,'b'>
等不同。
因此,對於模板參數的每個選擇,也分別分配和初始化靜態成員。
在這方面,非類型參數,類型參數和模板參數都以相同的方式工作。
作爲參考,由標準(C++ 11):
(§14.7/ 6)的每個類模板特從模板實例有它自己的任何靜態成員的副本。 [實施例:
template<class T> class X { static T s; }; template<class T> T X<T>::s = 0; X<int> aa; X<char*> bb;
X<int>
具有靜態構件int
類型的s
,和X<char*>
具有char*
類型的靜態成員s
。 - 結束示例]
上述標準給出的示例涉及類型參數,但第14.7/6節是模板一般性討論的一部分。更廣泛的上下文清楚地表明,這適用於使用非類型參數(或類型,非類型和模板參數的組合)的模板。
還有上式等價爲模板實例化,這被認爲是相等的(由我強調的相關部分)在什麼情況下使用模板非類型參數的實例解釋了部分:
(§14/1)如果
- 它們的模板名稱,運算符函數id或文字運算符id指向相同的模板並且它們對應的類型模板參數相同,則兩個模板id指向相同的類別或函數是相同的類型和
- 它們對應的整型或枚舉類型的非類型模板參數具有相同的值和
- 它們對應的指針類型的非類型模板參數指向相同的外部對象或函數,或者都是空指針值和它們的對應值指向成員類型的非類型模板參數引用同一個類成員,或者都是空成員指針值,並且它們對應的非引用類型的非類型模板參數引用相同的外部對象或函數和
- 它們對應的模板模板參數指向相同的模板。
放在上下文中,這意味着相同類模板的兩個實例構成兩個不同的數據類型,即使它們只有一個非類型參數的值不同。
謝謝,直接回答我的問題。 – Twifty
- 1. 靜態非模板成員函數與靜態模板成員函數
- 2. 靜態成員和模板在C++
- 3. C++模板和靜態成員 - 在頭
- 4. 強制模板靜態成員實例
- 5. 使用模板參數的靜態成員模板
- 6. 訪問靜態成員靜態成員
- 7. 靜態成員
- 8. 刪除不使用的模板實例化的靜態成員
- 9. 一個模板的靜態const成員的不同值struct
- 10. 跨多個DLL/DSO的靜態成員的模板類
- 11. C++模板類變化的靜態成員的值
- 12. 模板化的外部類的靜態成員初始化
- 13. 模板類的靜態const成員變量VS靜態常量成員變量的初始化
- 14. 從模板化(靜態)成員函數訪問受保護的成員
- 15. 初始化模板類的靜態數據成員的部分模板特化
- 16. 模板類中的不可複製靜態常量成員類
- 17. 模板超類的靜態成員定義
- 18. 基於靜態成員類型的模板功能專業化
- 19. 未被調用的C++模板靜態成員構造函數
- 20. 類模板中的靜態函數指針成員
- 21. C++中的非成員靜態模板方法定義?
- 22. 初始化模板類內的靜態std :: map成員?
- 23. 在python中使用靜態成員的模板中swig undefined symbol
- 24. 如何初始化參數化模板類的靜態成員
- 25. 模板類的ODR與靜態constexpr成員
- 26. 導出/定義靜態模板專門的成員變量C++
- 27. 成員模板靜態函數的類型特徵
- 28. 類模板專業化中的靜態成員函數
- 29. 作爲函數指針的靜態模板成員函數
- 30. 模板中的靜態成員變量,帶有多個DLL
後者。 ... – jxh
您的鏈接問題可以解答此問題。它爲每個不同的論點創建一個新的類。 – Rapptz
什麼是downvotes?在我看來一個有效的問題。我的編譯器顯示struct foo是foo的類型,在我看來,所有這些類型都是相同的,應該共享靜態成員。 –
Twifty