没有数据成员,因为对象的大小永远不会为零,并且数据成员没有退出子句。
但是,如果基类子对象为空,则其大小可以为零。因此:
template <typename T>
struct Member {
T member;
};
template <>
struct Member<void> {
};
template <typename T>
class C : private Member<T>
{
//... some other members that are not of interest here
};
应该工作,我想。但是你可能会因为C<void>::member
不存在而绊倒,所以任何使用它的成员函数都不会编译 for C<void>
,包括构造函数。
如果用户想要存储额外的数据,他将构建
C<MyAdditionalData>
为什么没有C
一个没有额外数据成员的非模板类,如果用户想添加数据成员,C
作为基类使用?记住要给出C
一个受保护的析构函数——每个基类都应该有一个受保护的析构函数或一个虚拟析构函数,但是由于您的C
模板类没有虚拟析构函数,因此非模板版本也不需要是虚拟的。
按照这些思路,您可以执行以下操作:
class CNoData
{
//... some other members that are not of interest here
};
template <typename T>
class CWithData<T> : CNoData
{
T member
// have to duplicate constructors, unfortunately.
};
如果你真的需要它,添加一个类型特征:
template <typename T>
struct C {
typedef CWithData<T> type;
};
template <>
struct C<void> {
typedef CNoData type;
};
然后你会写在哪里C<MyAdditionalData>
,现在你写CWithData<MyAdditionalData>
,你会写C<some_type_that_might_be_void>
你写typename C<some_type_that_might_be_void>::type
。