[英]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语言的任何新标准中都没有。 那会允许的。 如前所述,也许有一个技巧。
查看boost::tuple
和boost::compressed_pair
。 一个类的大小不能为0,但是有一个“空基类”优化的概念。 嗯,我只想链接到我以前的答案之一,就在这里与IMO相关: 什么是std :: pair?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.