0

假设我有 3 节课。我希望每个类的 sizeof() 完全相同——比如 512 个字节。

我怎样才能使用类似的东西BOOST_STATIC_ASSERT适用于所有这些,这样

  1. 我只需要BOOST_STATIC_ASSERT在一个地方使用(DRY原则)
  2. 在编译时而不是运行时评估一次

注意:我们可以使用我们想要的任何 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 );
4

2 回答 2

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 */ };

于 2009-05-27T00:05:28.433 回答
1

由于这些类没有关系,我现在看到了这样做的方法,因为您必须明确说明要检查的女巫类型。

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 的可能方法是将所有静态断言放在一个地方。

于 2009-05-27T00:25:32.120 回答