簡體   English   中英

sizeof(…)= 0或C ++模板中的條件變量聲明

[英]sizeof(…) = 0 or conditional variable declaration in c++ templates

假設我有這樣的事情:

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最多可能浪費19個字節。

問題是:

1)有沒有辦法創建大小為0的類?

2)有沒有辦法有條件地定義一個變量? 像這樣的東西:

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

謝謝!

允許使用黑色魔術宏。

我在MacOSX上使用g ++。

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

#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

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

2)並非沒有宏...或者只有boost.org忍者才能掌握的晦澀的模板妖術。 我聽說過編譯時“ if”的想法,但是目前在AFAIK語言的任何新標准中都沒有。 那會允許的。 如前所述,也許有一個技巧。

  1. 一堂課必須有一定規模(至少一個)。 請參閱“ C / C ++中可能的最小對象大小是多少?
  2. AFAIK,不,您不能。

查看boost::tupleboost::compressed_pair 一個類的大小不能為0,但是有一個“空基類”優化的概念。 嗯,我只想鏈接到我以前的答案之一,就在這里與IMO相關: 什么是std :: pair?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM