据我记得,BOOST_MPL_ASSERT
曾经受到青睐。这是否仍然正确?有人知道为什么吗?
BOOST_MPL_ASSERT和BOOST_STATIC_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
的讨论,但我认为每个人最终都同意,在世界上仍然有它的存在空间。
相关问题
热门标签
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding