Поскольку эти классы не имеют отношения, я теперь вижу способ сделать это, потому что вы должны четко указывать типы ведьм, которые вы хотите проверить.
Единственный СУХОЙ способ обеспечить это - то, что предложил Николай Н. Фестисов. Я писал подобный пример с некоторыми незначительными изменениями, но глобальная идея состоит в том, чтобы создать класс, подобный boost :: nocopy, который заставит дочерний класс иметь заданный размер.
template< typename CheckedType, size_t FixedSize >
class SizeChecked // simple, no inheritance overload
{
public:
SizeChecked()
{
// c++0x or compilers with static_assert() available
//static_assert( sizeof( CheckedType ) == FixedSize, "Type size check failed!" );
BOOST_STATIC_ASSERT( sizeof( CheckedType ) == FixedSize );
}
};
template< typename CheckedType >
class Size512 : public SizeChecked< CheckedType, 512 > // simple, no inheritance overload
{};
////////////////////////////////////////////////////////////////////
class A : Size512< A > // automatically check
{
};
class B : Size512< B > // automatically check
{
std::array< char, 512 > m_array;
};
class C : SizeChecked< C, 1 >
{
char m_char;
};
class D : SizeChecked< D, 4 >
{
short m_k;
char m_u;
};
int wmain()
{
// need instantiation to be checked !
//A a; // will trigger the assertion at compile time
B b; // sizeof(B) == 512 : will be fine
C c; // sizeof(C) == 1 : will be fine
//D d; // will fail because sizeof( short ) + sizeof( char ) != 4 !
}
Осторожно: если вы потеряете наследование, вам все равно придется явно проверить дочерние классы, проверка не наследуется!
Кстати, возможный способ быть более СУХИМЫМ - это поместить все ваши статические утверждения в одном месте.