当前位置:  开发笔记 > 编程语言 > 正文

哪个更好BOOST_MPL_ASSERT或BOOST_STATIC_ASSERT?

如何解决《哪个更好BOOST_MPL_ASSERT或BOOST_STATIC_ASSERT?》经验,为你挑选了1个好方法。

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



1> jwfearn..:

[回答我自己的问题]

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

BOOST_STATIC_ASSERT( P )如果生成编译错误P != true.

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

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

这是一个示例程序,演示如何使用(和滥用)这些宏:

#include 
#include 
#include 
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'
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::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尽管其错误消息可能不太清楚(取决于您的编译器),但对代码的冗长程度较低.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有