English 中文(简体)
BOOST_MPL_ASSERT和BOOST_STATIC_ASSERT哪个更好?
原标题:
  • 时间:2008-10-11 00:32:26
  •  标签:

据我记得,BOOST_MPL_ASSERT 曾经受到青睐。这是否仍然正确?有人知道为什么吗?

最佳回答

[回答自己的问题]

这要看情况。这是一个苹果和橙子的比较。虽然相似,但这些宏并不可以互换。以下是每个宏的工作概要:

BOOST_STATIC_ASSERT(P)P != true的情况下会生成编译错误。

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

尽管需要使用双括号,但后一种形式特别有用,因为如果使用 Boost.MPL 或 TR1 s 的布尔零元元函数作为谓词,它可以生成更具信息量的错误消息。

这里有一个示例程序,演示了如何使用(和误用)这些宏:

#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

因此,如果您正在使用元函数(如此处定义),作为谓词,那么使用BOOST_MPL_ASSERT作为断言时,代码更简洁,更具信息性。

对于简单的布尔谓词,使用 BOOST_STATIC_ASSERT 的代码较少冗长,尽管其错误消息可能不太清楚(取决于您的编译器)。

问题回答

BOOST_MPL_ASSERT(仍然)通常被认为更好。从中得到的消息有些更容易看到(如果您使用BOOST_MPL_ASSERT_MSG,还容易理解)。几个月前有一些关于弃用BOOST_STATIC_ASSERT的讨论,但我认为每个人最终都同意,在世界上仍然有它的存在空间。





相关问题
热门标签