2010-02-19 41 views
1

假設我有這樣的事情:現在的sizeof(...)= 0或C條件變量聲明++模板

struct EmptyClass{}; 
template<typename T1, typename T2 = EmptyClass, 
     typename T3 = EmptyClass, typename T4 = EmptyClass, 
     ..., typename T20> class PoorMansTuple { 
    T1 t1; 
    T2 t2; 
    ... 
    T20 t20; 
}; 

,我可能會浪費高達每PoorMansTuple 19bytes。

的問題是:

1)有沒有一種方法創建一個類大小爲0?

2)有沒有一種方法來有條件地定義一個變量? Somethign like:

T1 t1; 
    if (T2 != EmptyClass) T2 t2; // pseudo code 
    if (T3 != EmptyClass) T3 t3; // ... 

謝謝!

預先使用黑魔法宏。

我在MacOSX上使用g ++。

+0

你可以備份一下,並告訴我們更一般的你想做什麼?這可能是你的一般問題有一個更簡單的解決方案。 – 2010-02-19 00:24:50

回答

4

部分專業化可能是你正在尋找問題的第一部分。這個程序

#include <string> 
#include <iostream> 

struct EmptyClass {}; 

template<typename T1, typename T2> 
class Tuple 
{ 
    T1 t1; 
    T2 t2; 
}; 

template<typename T1> 
class Tuple <T1, EmptyClass> 
{ 
    T1 t1; 
}; 


int main (void) 
{ 
    Tuple<std::string, std::string> two; 
    Tuple<std::string, EmptyClass> one1; 
    Tuple<std::string> one2; 

    std::cout << "<string, string>: " << sizeof(two) << std::endl; 
    std::cout << "<string, empty> : " << sizeof(one1) << std::endl; 
    std::cout << "<string>  : " << sizeof(one2) << std::endl; 

    return 0; 
} 

打印

<string, string>: 32 
<string, empty> : 16 
<string>  : 16 
+0

(+1)您可以減少從1元組中獲取2元組所需的代碼量 - 這樣您只需要在2元組中定義「T2 t2;」。一般來說,你只需要通過從n元組派生來定義每個(n + 1)-tuple成員。 – 2010-02-19 01:04:13

1

1)不,因爲該類的實例不能擁有內存地址。它至少需要1個字節才能擁有地址。 - 也就是說,沒有任何實例和直接引用的類(僅用於例如模板生成)沒有大小,因爲它不在編譯的程序中。

2)不是沒有宏...或者只有boost.org ninjas可以掌握的晦澀模板黑色藝術。我聽說過編譯時「如果」的想法,但目前它還不在語言AFAIK的標準中。這將允許它。正如已經說過的,也許有一個技巧可以做到。

1

退房boost::tupleboost::compressed_pair。一個類不能有sizeof 0,但有一個「空基類」優化的概念。嗯,我只是想鏈接到我以前的答案之一,這裏是非常相關的國際海事組織:What is std::pair?