哪个更好BOOST_MPL_ASSERT或BOOST_STATIC_ASSERT?

时间:2008-10-11 00:32:26

标签: c++ boost

我记得BOOST_MPL_ASSERT曾经是首选。这仍然是真的吗?谁知道为什么?

2 个答案:

答案 0 :(得分:15)

[回答我自己的问题]

这取决于。这是苹果与橘子的比较。虽然类似,但这些宏不可互换。以下是每种方法的摘要:

如果BOOST_STATIC_ASSERT( P )

P != true会生成编译错误 如果BOOST_MPL_ASSERT(( P ))

P::type::value != true会生成编译错误

尽管需要双括号,后一种形式特别有用,因为它可以生成更多信息性的错误消息如果使用布尔的nullary元功能来自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;
}

为了比较,以下是我的编译器(Microsoft Visual C ++ 2008)为上面第19行和第21行生成的错误消息:

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

因此,如果您使用元函数(定义为here)作为谓词,那么BOOST_MPL_ASSERT对代码的冗长程度会更低,并且在断言时会提供更多信息。

对于简单的布尔谓词,BOOST_STATIC_ASSERT对代码的详细程度较低,尽管其错误消息可能不太清楚(取决于您的编译器)。

答案 1 :(得分:3)

BOOST_MPL_ASSERT通常被认为是更好的。来自它的消息更容易看到(并理解,如果您使用BOOST_MPL_ASSERT_MSG)。几个月前有一些关于弃用BOOST_STATIC_ASSERT的讨论,尽管我认为每个人最终都认为世界上还有空间。