如何静态断言许多类的公共属性

时间:2009-05-26 23:47:37

标签: c++ boost static-assert

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

如何使用BOOST_STATIC_ASSERT之类的内容来应用所有这些

  1. 我只需要在一个地方使用BOOST_STATIC_ASSERT(DRY原则)
  2. 在编译时评估一次而不是运行时
  3. 注意:我们可以使用我们想要的任何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 );
    

2 个答案:

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