我试图做那样的事情:
#define VERIFY_EXPECTATIONS \
BOOST_MPL_ASSERT((expectation1)); \
BOOST_MPL_ASSERT((expectation2)); \
BOOST_MPL_ASSERT((expectation3))
当写VERIFY_EXPECTATIONS;
排队时,比如42,我收到有关mpl_assertion_in_line_42
的冲突声明的错误。
我理解发生了什么(BOOST_MPL_ASSERT
使用的标识符取决于调用宏的行)但我的问题是:是否有一种已知的解决方法来执行此类操作?
编辑:
更确切地说,期望看起来像这样:
#define TEST_SOME_SET_OF_PREDICATES(Arg) \
BOOST_MPL_ASSERT ((some_predicate<Arg>)); \
BOOST_MPL_ASSERT_NOT((some_other_predicate<Arg>))
TEST_SOME_SET_OF_PREDICATES(some_type);
TEST_SOME_SET_OF_PREDICATES(some_other_type);
我已经实现了谓词,我想用几种类型来测试它们。
注意:
我对以下内容不是很感兴趣:
template <typename Arg>
struct compound_predicate : boost::mpl::and_<
some_predicate<Arg>,
boost::mpl::not_<some_other_predicate<Arg> >
> {};
BOOST_MPL_ASSERT((compound_predicate<some_type>));
BOOST_MPL_ASSERT((compound_predicate<some_other_type>));
因为当断言失败时,我们不知道哪些期望是错误的。
Praetorian建议的解决方案如下:
template <typename Arg>
struct expectations {
BOOST_MPL_ASSERT ((some_predicate<Arg>));
BOOST_MPL_ASSERT_NOT((some_other_predicate<Arg>));
};
然后使用expectations
和some_type
实例化some_other_type
。我必须实现一个宏,它声明一个类型为expectations<Arg>
的对象,每次调用时都有一个不同的标识符。它看起来有点像重新实现(某些部分)静态断言。
还有其他想法吗?