オブジェクトのサイズが 0 になることはなく、データ メンバーの get-out 句がないため、データ メンバーはありません。
ただし、基本クラスのサブオブジェクトが空の場合、サイズが 0 になることがあります。したがって:
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
。