2010-10-24 45 views
2

我試圖讓我的模板的任何可能的實例作爲編譯時間常量的最大尺寸。浮現在腦海的第一件事是這樣的......聯盟中的模板類?

union TestUnion 
{ 
template<typename T> class MyClass 
{ 
public: 
    MyClass() { }; 
    MyClass(T& t) : _t(t) { } 

private: 
    T _t; 
}; 
}; 
例如

sizeof(TestUnion)總是等於1,但sizeof(MyClass<int>),正確返回4.任何人有任何更好的想法?

回答

1

您正在獲得沒有成員的工會的規模。在聯合作用域內聲明模板不會聲明任何聯合成員。在C++(也是我相信C)中,確保所有類或聯合類型至少佔用1個字節的空間。所以這就是爲什麼大小爲1的原因。

沒有辦法獲得最大可能的大小,這是因爲模板類可以包含一個任意類型的實例,直到實例化該模板才能知道該實例。這種類型可以是任意大小。我將在一兩個小時或兩小時內說明我在編輯此帖時的意思。

+0

沒錯。我在這裏理解這個問題。所以如果我在聯盟內部實例化模板,那就行得通了。不幸的是,我不確定這是否適合我。 – 23L 2010-10-24 04:02:40

+0

@ 23L - 好吧,別人發佈了一個很好的例子,所以我不會打擾我的。 :-) – Omnifarious 2010-10-24 04:31:42

0

我不是一個專家,當談到調整C++類...我敢肯定有更好的方法。假設你只想爲你打算使用的所有實例設置一個潛在的最大尺寸,這裏有一個可能的方法:

const foo =(sizeof(MyClass)> sizeof(MyClass)?(sizeof(MyClass)):sizeof( MyClass的)

然後重複到無端根據需要嵌套它們。

2

有沒有這樣的事,作爲一個模板類的最大尺寸,尤其是如果類包含模板參數的一個實例,爲你做。考慮每個

 
    template <typename T> class MyClass { 
    public: 
     MyClass() { }; 
     MyClass(T& t) : _t(t) { } 

    private: 
     T _t; 
    }; 

    union TestUnion { 
    MyClass<char>; 
    MyClass<unsigned char>; 
    MyClass<signed char>; 
    MyClass<short>; 
    // ... 
    MyClass<float>; 
    MyClass<double>; 
    MyClass<char*>; 
    MyClass<int*>; 
    // ... 
    MyClass<void*>; 
    MyClass<void (*)(void)>; 
    MyClass<std::vector>; 
    // ... 
    MyClass<int[10]>; 
    MyClass<int[100]>; 
    MyClass<int[1000]>; 
    MyClass<int[10000]>; 
    MyClass<int[100000]>; 
    }; 

等等......或者同樣令人興奮,插入

 
    MyClass< MyClass< MyClass< ... < XImage > ... > > > 

(這是不可否認不能保證在比承諾的最大嵌套模板實例化深度更大的工作(17現在,1024推出))。

所以,顯然沒有理論上的最大值。如果你有一個類型的宇宙實際上是MyClass <>的模板參數,那麼它可能是可行的。

編輯 - 將<替換爲&lt;,這樣模板參數不會被SO分析器隱藏。