Templated classes in a union?
I'm trying to get the maximum size of any possible instance of my template as a co开发者_如何学编程mpile time constant. The first thing that came to mind was something like this...
union TestUnion
{
template<typename T> class MyClass
{
public:
MyClass() { };
MyClass(T& t) : _t(t) { }
private:
T _t;
};
};
But sizeof(TestUnion) is always equal to 1, but sizeof(MyClass<int>) for instance, correctly returns 4. Anyone have any better ideas?
There is no such thing as the maximum size of a template class, especially if that class contains an instance of the template argument, as yours does. Consider each of
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]>;
};
and so on... Or equally excitingly, insert
MyClass< MyClass< MyClass< ... < XImage > ... > > >
(which is admittedly not guaranteed to work at greater than the promised maximum nested template instantiation depth (17 now, 1024 soon)).
So, clearly there's no theoretical maximum. If you have a universe of types in mind that will actually be template parameters to MyClass<>, then it might be do-able.
EDIT -- replaced < with < so the template argument wouldn't be hidden by the SO parser.
You are getting the size of a union that has no members. Declaring a template within a union scope doesn't declare any union members. In C++ (and also I believe C) it is guaranteed that all class or union types occupy at least 1 byte of space. So that's why the size is 1.
There is no way to get the maximum possible size, and that's because a template class can contain an instance of an arbitrary type that's not known until the template is instantiated. This type could be of arbitrary size. I will illustrate what I mean in an edit to this post within an hour or two.
I'm not an expert when it comes to sizing C++ classes... I'm sure there is a better way. Assuming you want just a potential maximum size for all the instances you plan on using, here is a likely hacky way:
const foo = (sizeof(MyClass) > sizeof(MyClass) ? (sizeof(MyClass) : sizeof(MyClass)
Then repeat to no-end nesting them as needed.
加载中,请稍侯......
精彩评论