c++ - sizeof(...) = 0 或 C++ 模板中的条件变量声明

标签 c++ templates conditional-statements sizeof

假设我有这样的东西:

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

最佳答案

Partial specialization 可能是你要找的问题的第一部分。这个程序

#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

关于c++ - sizeof(...) = 0 或 C++ 模板中的条件变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293231/

相关文章:

c++ - 为什么 unicode 字符在 C++ std::string 中被同等对待?

python - jinja2 模板中的路径解析

将数据框中的行替换为 0,前一行值不等于 0

c++ - ARM 设备的交叉编译库

c++ - 使用 C++ 以漂亮的方式打印二叉树

c++ - 非类型模板参数的理解

mysql - 如何在 MYSQL 中使用 if 查询创建虚拟列

Swift Forin-在哪里执行过滤或跳过(继续)?

c++ - C++ 中的枚举数据类型和类 API

c++ - CRTP 和模板化表达式