在宏中组合几个MPL断言

时间:2016-01-08 16:14:38

标签: c++ c-preprocessor boost-mpl

我试图做那样的事情:

#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>));
};

然后使用expectationssome_type实例化some_other_type。我必须实现一个宏,它声明一个类型为expectations<Arg>的对象,每次调用时都有一个不同的标识符。它看起来有点像重新实现(某些部分)静态断言。

还有其他想法吗?

0 个答案:

没有答案