12

私が思い出しBOOST_MPL_ASSERTたように、かつては好まれていました。これはまだ本当ですか?理由を知っている人はいますか?

4

2 に答える 2

15

[私自身の質問に答える]

場合によります。これはリンゴとオレンジの比較です。類似していますが、これらのマクロは互換性がありません。それぞれの仕組みの概要は次のとおりです。

BOOST_STATIC_ASSERT( P )の場合、コンパイルエラーを生成しますP != true

BOOST_MPL_ASSERT(( P ))の場合、コンパイルエラーを生成しますP::type::value != true

後者の形式は、二重括弧が必要ですが、Boost.MPLまたはTR1のブールヌルメタ関数述語として使用すると、より有益なエラーメッセージを生成できるため、特に便利です。<type_traits>

これらのマクロの使用方法(および誤用)を示すサンプルプログラムを次に示します。

#include <boost/static_assert.hpp>
#include <boost/mpl/assert.hpp>
#include <type_traits>
using namespace ::boost::mpl;
using namespace ::std::tr1;

struct A {};
struct Z {};

int main() {
        // boolean predicates
    BOOST_STATIC_ASSERT( true );          // OK
    BOOST_STATIC_ASSERT( false );         // assert
//  BOOST_MPL_ASSERT( false );            // syntax error!
//  BOOST_MPL_ASSERT(( false ));          // syntax error!
    BOOST_MPL_ASSERT(( bool_< true > ));  // OK
    BOOST_MPL_ASSERT(( bool_< false > )); // assert

        // metafunction predicates
    BOOST_STATIC_ASSERT(( is_same< A, A >::type::value ));// OK
    BOOST_STATIC_ASSERT(( is_same< A, Z >::type::value ));// assert, line 19
    BOOST_MPL_ASSERT(( is_same< A, A > ));                // OK
    BOOST_MPL_ASSERT(( is_same< A, Z > ));                // assert, line 21
    return 0;
}

比較のために、上記の19行目と21行目でコンパイラ(Microsoft Visual C ++ 2008)が生成したエラーメッセージを次に示します。

1>static_assert.cpp(19) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'
1>        with
1>        [
1>            x=false
1>        ]
1>static_assert.cpp(21) : error C2664: 'boost::mpl::assertion_failed' : cannot convert parameter 1 from 'boost::mpl::failed ************std::tr1::is_same<_Ty1,_Ty2>::* ***********' to 'boost::mpl::assert<false>::type'
1>        with
1>        [
1>            _Ty1=A,
1>            _Ty2=Z
1>        ]
1>        No constructor could take the source type, or constructor overload resolution was ambiguous

したがって、メタ関数(ここで定義されている)を述語として使用している場合BOOST_MPL_ASSERTは、コーディングの冗長性が低く、アサート時の情報量が多くなります。

単純なブール述語のBOOST_STATIC_ASSERT場合、エラーメッセージはあまり明確ではないかもしれませんが(コンパイラによっては)、コーディングの冗長性は低くなります。

于 2009-03-26T19:51:02.063 に答える
3

BOOST_MPL_ASSERT(まだ)一般的に優れていると考えられています。それからのメッセージは幾分見やすくなりました (そして を使用すれば理解できますBOOST_MPL_ASSERT_MSG)。数か月前に を非推奨BOOST_STATIC_ASSERTにすることについていくつかの話がありましたが、世界にはまだその余地があることに誰もが最終的に同意したと思います.

于 2008-10-11T01:58:56.043 に答える