gpt4 book ai didi

c++ - BOOST_MPL_ASSERT 和 BOOST_STATIC_ASSERT 哪个更好?

转载 作者:IT老高 更新时间:2023-10-28 23:15:01 27 4
gpt4 key购买 nike

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

最佳答案

[回答我自己的问题]

这取决于。这是一个苹果与橘子的比较。尽管相似,但这些宏不可互换。以下是每个工作原理的摘要:

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

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

尽管需要双括号,后一种形式特别有用,因为它可以生成更多信息性错误消息如果使用 bool 空元元函数来自 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断言时代码既不冗长,又提供更多信息。

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

关于c++ - BOOST_MPL_ASSERT 和 BOOST_STATIC_ASSERT 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com