我记得BOOST_MPL_ASSERT
以前曾经是首选.这仍然是真的吗?谁知道为什么?
[回答我自己的问题]
这取决于.这是苹果与橘子的比较.虽然类似,但这些宏不可互换.以下是每种工作原理的摘要:
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
尽管其错误消息可能不太清楚(取决于您的编译器),但对代码的冗长程度较低.