我正在尝试将模板的任何可能实例的最大大小作为编译时常量。想到的第一件事就是这样......
union TestUnion
{
template<typename T> class MyClass
{
public:
MyClass() { };
MyClass(T& t) : _t(t) { }
private:
T _t;
};
};
但sizeof(TestUnion)
总是等于1,但sizeof(MyClass<int>)
例如,正确返回4.任何人都有更好的想法吗?
答案 0 :(得分:2)
没有模板类的最大大小,特别是如果该类包含模板参数的实例,就像你的那样。考虑每个
template <typename T> class MyClass { public: MyClass() { }; MyClass(T& t) : _t(t) { } private: T _t; }; union TestUnion { MyClass<char>; MyClass<unsigned char>; MyClass<signed char>; MyClass<short>; // ... MyClass<float>; MyClass<double>; MyClass<char*>; MyClass<int*>; // ... MyClass<void*>; MyClass<void (*)(void)>; MyClass<std::vector>; // ... MyClass<int[10]>; MyClass<int[100]>; MyClass<int[1000]>; MyClass<int[10000]>; MyClass<int[100000]>; };
依此类推......或同样令人兴奋的是,插入
MyClass< MyClass< MyClass< ... < XImage > ... > > >
(无可否认,这不能保证工作在大于承诺的最大嵌套模板实例化深度(现在17,即将推出1024))。
所以,显然没有理论上的最大值。如果你有一个类型的世界,实际上是MyClass&lt;&gt;的模板参数,那么它可能是可行的。
编辑 - 替换&lt;使用<
,因此模板参数不会被SO解析器隐藏。
答案 1 :(得分:1)
您正在获得没有成员的联盟的大小。在联合范围内声明模板不会声明任何联合成员。在C ++中(我也相信C),保证所有类或联合类型占用至少1个字节的空间。这就是为什么尺寸为1。
无法获得最大可能的大小,这是因为模板类可以包含在实例化模板之前不知道的任意类型的实例。这种类型可以是任意大小。我将在一两个小时内说明我对这篇文章的编辑意味着什么。
答案 2 :(得分:0)
在调整C ++类的大小时,我不是专家......我确信有更好的方法。假设您只想要计划使用的所有实例的潜在最大大小,这可能是一种愚蠢的方式:
const foo =(sizeof(MyClass)&gt; sizeof(MyClass)?(sizeof(MyClass):sizeof(MyClass)
然后根据需要重复到无端嵌套。