2013-07-17 196 views
0

還有一個類似的問題here,但它與typename關鍵字的模板有關。模板的靜態成員

給定一個模板:

template < int X, char Y > 
struct foo 
{ 
    char myArray[ X <= 0 ? 1 : X ]; 
    static const char Z = Y; 
} 

但願靜態成員的所有實例之間共享foo或將編譯器看到模板被稱爲具有不同的參數,並創建一個新的類型?

+0

後者。 ... – jxh

+0

您的鏈接問題可以解答此問題。它爲每個不同的論點創建一個新的類。 – Rapptz

+0

什麼是downvotes?在我看來一個有效的問題。我的編譯器顯示struct foo是foo的類型,在我看來,所有這些類型都是相同的,應該共享靜態成員。 – Twifty

回答

3

分配給它的靜態常量成員根據模板參數傳遞的值而變化。縮短到這樣的事情:

template<int X> 
struct foo { 
    static const int value = X; 
}; 

你不會想到foo<10>::value等於foo<11>::value你會嗎?這通常用於模板元編程,因爲該靜態常量的值取決於模板參數。

+0

謝謝,把它說得很清楚。 – Twifty

3

事實上,您定義的模板參數是非類型參數,而不是其他兩種模板參數:類型參數和模板參數。

但是,它們仍然是模板參數,您將爲每個不同的模板參數集獲得全新的數據類型。例如,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指向相同的類別或函數是相同的類型和
- 它們對應的整型或枚舉類型的非類型模板參數具有相同的值
- 它們對應的指針類型的非類型模板參數指向相同的外部對象或函數,或者都是空指針值和它們的對應值指向成員類型的非類型模板參數引用同一個類成員,或者都是空成員指針值,並且它們對應的非引用類型的非類型模板參數引用相同的外部對象或函數和
- 它們對應的模板模板參數指向相同的模板。

放在上下文中,這意味着相同類模板的兩個實例構成兩個不同的數據類型,即使它們只有一個非類型參數的值不同。

+0

謝謝,直接回答我的問題。 – Twifty

相關問題