首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sizeof(...) =0或c++模板中的条件变量声明

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

Stack Overflow用户
提问于 2010-02-19 08:14:05
回答 4查看 808关注 0票数 1

假设我有这样的东西:

代码语言:javascript
复制
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)有没有办法有条件地定义一个变量?类似于:

代码语言:javascript
复制
  T1 t1;
  if (T2 != EmptyClass) T2 t2; // pseudo code
  if (T3 != EmptyClass) T3 t3; // ...

谢谢!

黑魔法宏的使用是被允许的。

我在MacOSX上使用g++。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-19 08:59:10

部分专业化可能是您在问题的第一部分所寻找的。此程序

代码语言:javascript
复制
#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;
}

打印

代码语言:javascript
复制
<string, string>: 32
<string, empty> : 16
<string>        : 16
票数 4
EN

Stack Overflow用户

发布于 2010-02-19 08:20:23

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

2)不是没有macro...or,也许只有boost.org忍者才能掌握的模糊模板黑术。我听说过编译时"if“的概念,但它目前还没有出现在AFAIK语言的任何即将到来的标准中。那将会允许它。正如已经说过的,也许有一个技巧可以做到这一点。

票数 1
EN

Stack Overflow用户

发布于 2010-02-19 08:41:49

  1. 类必须有一定的大小(至少一个)。See "What Is the Smallest Object Size Possible in C/C++?"
  2. AFAIK,no you can't.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2293231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档