我有一堆屬性可以是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的大小屬性,而被空類,不爲0,這意味着100個空屬性添加了大量的未使用空間MyUberClass。
有沒有辦法避免這種情況,並添加/刪除基於模板參數的成員變量?
編輯:
據我所知,空的類沒有大小的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
2012-03-19 03:30:39
100只是誇大了這個問題。 – Howie 2012-03-19 03:37:15