1

假设我有这样的事情:

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++。

4

4 回答 4

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
于 2010-02-19T00:59:10.080 回答
1

1)不,因为类的实例不能有内存地址。它至少需要 1 个字节才能有一个地址。- 也就是说,没有任何实例和直接引用的类(例如仅在模板生成时使用)将没有大小,因为它不在编译的程序中。

2) 不是没有宏……或者可能是只有 boost.org 忍者才能掌握的晦涩模板黑艺术。我听说过编译时“if”的想法,但它目前不在任何即将到来的语言 AFAIK 标准中。那本来可以的。如前所述,也许有一个技巧可以做到。

于 2010-02-19T00:20:22.923 回答
1
  1. 一个类必须有一定的大小(至少一个)。请参阅“ C/C++ 中可能的最小对象大小是多少?
  2. AFAIK,不,你不能。
于 2010-02-19T00:41:49.200 回答
1

签出boost::tupleboost::compressed_pair。一个类的大小不能为 0,但有“空基类”优化的概念。嗯,我只是要链接到我以前的答案之一,这里非常相关 IMO:什么是 std::pair?

于 2010-02-19T01:03:01.757 回答