假设我有3节课。我希望sizeof()每个类都完全相同 - 比如说512个字节。
如何使用BOOST_STATIC_ASSERT
之类的内容来应用所有这些
BOOST_STATIC_ASSERT
(DRY原则)注意:我们可以使用我们想要的任何C ++技术(创建更多类,使用继承等)
我天真的解决方案如下:
class A { ...stuff }; BOOST_STATIC_ASSERT( sizeof(A) == 512 );
class B { ...stuff }; BOOST_STATIC_ASSERT( sizeof(B) == 512 );
class C { ...stuff }; BOOST_STATIC_ASSERT( sizeof(C) == 512 );
答案 0 :(得分:9)
这似乎适用于gcc 4.0.1和boost 1.39:
template <typename T, size_t S>
struct enforce_size
{
enforce_size()
{
BOOST_STATIC_ASSERT( sizeof( T ) == S );
}
};
class A: enforce_size<A,512> { /* stuff */ };
答案 1 :(得分:1)
由于这些课程没有任何关系,我现在看到这样做是因为你必须明确你想要检查的女巫类型。
唯一可行的方法是尼古拉·恩·费斯蒂索夫提出的。我正在编写一个类似的例子,只做了一些小修改,但全局的想法是创建一个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的可能方法是将所有静态断言放在一个地方。