私が思い出しBOOST_MPL_ASSERT
たように、かつては好まれていました。これはまだ本当ですか?理由を知っている人はいますか?
2 に答える
[私自身の質問に答える]
場合によります。これはリンゴとオレンジの比較です。類似していますが、これらのマクロは互換性がありません。それぞれの仕組みの概要は次のとおりです。
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
場合、エラーメッセージはあまり明確ではないかもしれませんが(コンパイラによっては)、コーディングの冗長性は低くなります。
BOOST_MPL_ASSERT
(まだ)一般的に優れていると考えられています。それからのメッセージは幾分見やすくなりました (そして を使用すれば理解できますBOOST_MPL_ASSERT_MSG
)。数か月前に を非推奨BOOST_STATIC_ASSERT
にすることについていくつかの話がありましたが、世界にはまだその余地があることに誰もが最終的に同意したと思います.