由于这些类没有关系,我现在看到了这样做的方法,因为您必须明确说明要检查的女巫类型。
Nikolai N Fesissov 提出的唯一 DRY 方式来执行此操作。我正在编写一个类似的示例,并进行了一些小的修改,但总体思路是创建一个 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 !
}
请注意:如果您失去继承,您仍然必须对子类进行显式检查,检查不会被继承!
顺便说一句,一种更 DRY 的可能方法是将所有静态断言放在一个地方。