私はNOPか状態を持つことができる属性の束を持っています。それらの要件は、ユーザーが属性を必要としないときにサイズを持たないことですが、依然として特定のメソッドを含んでいます。例:コンパイル時にメンバーを作成する
struct AttributeATag {};
/* The template used when AttributeATag is not specified */
template <typename T>
class AttributeA
{
public:
void foo(uint32_t v)
{
// Nop, do nothing
}
enum
{
HasAttributeA = false
};
};
/* The template specialization used when AttributeATag is specified */
template <>
class AttributeA<AttributeATag>
{
public:
void foo(uint32_t v)
{
this->omgVariable = v;
}
enum
{
HasAttributeA = true
};
protected:
int omgVariable;
};
template <typename ATag>
class MyUberClass : public AttributeA<ATag>
{
// This class now has omgVariable or not, depending on ATag and it
// has either a NOP method or one which actually does something
void doSomething()
{
if (AttributeA<ATag>::HasAttributeA)
{
/* ... */
}
}
};
これは動作しますが、今問題がある:NOPの大きさは、属性、空のクラスでありながら、100の空の属性はMyUberClassに未使用のスペースの多くを追加することを意味し、0ではありません。
テンプレートパラメータに基づいてメンバー変数を追加/削除する方法はありますか?
編集:私は次のことをしようとすると
私の知る限りでは、空のクラスは0の大きさを持っていない、私ははsizeof(B)== 4
template <typename T>
class A
{
};
class B : public A<int>, public A<double>, public A<char>, public A<long>, public A<bool>
{
};
を取得しますこのテストで
'AttributeA'は 'ATag = AttributeTag'の場合にのみサイズを持ちます。ケースの残りの部分は空のクラスのみになります。また、この「100」番号はどこから来るのでしょうか?私は何の問題も見ません。ご質問を明確にしてください。 –
iammilind
100は、問題を誇張して作られています。 – Howie