0

3つのクラスがあるとしましょう。sizeof() 各クラスがまったく同じであると予想しています-たとえば512バイトです。

BOOST_STATIC_ASSERTそのようなものすべてに適用するようなものをどのように使用できますか

  1. BOOST_STATIC_ASSERT1か所で使用するだけでよい(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 とブースト 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

これらのクラスには関係がないため、チェックしたい魔女のタイプを明示する必要があるため、これを行う方法がわかりました。

これを強制する唯一の DRY 方法は、Nikolai N Festissov が提案したものです。いくつかのマイナーな変更を加えた同様の例を書いていましたが、グローバルなアイデアは、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 にする方法として考えられるのは、すべての静的アサーションを 1 か所だけに配置することです。

于 2009-05-27T00:25:32.120 に答える