對於數據成員no,因爲對象從不是大小零,並且數據成員沒有退出子句。
然而,基類子對象可以有大小爲零,如果它是空的。因此:
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
不存在的事實,所以使用它的任何成員函數都不會編譯爲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
。
如果您不想要,您不必擁有會員。 'class C {};' – 2012-04-18 11:12:37
@BoPersson:當然,但我確實希望模板有可能存儲成員。 – Nobody 2012-04-18 11:13:17
也許你應該告訴我們你的目標是什麼,而不是你如何努力實現它。如果不知道自己想要達到什麼目的,很難得到五條建議(因爲如果你需要它,你不能讓'成員'佔用內存......) – Grizzly 2012-04-18 11:14:28