提升MPL和_类型

时间:2013-07-30 21:27:33

标签: c++ metaprogramming boost-mpl

我正在尝试在我的代码中使用and_,并且我遇到了返回类型的问题。我正在尝试将其与其他接受并返回true_type或false_type的元编程构造一起使用,并且我也对这些类型使用SFINAE重载。 boost :: mpl :: and_和boost :: mpl :: or_从mpl的其余部分返回不同的类型。至少,这对我来说就是这样。

mpl_::failed************ boost::is_same<mpl_::bool_<true>, boost::integral_constant<bool, true> >::************)

那么,我如何编写以下内容以便它传递断言?

template <typename T, typename U>
void foo(const T& test, const U& test2)
{
    typedef typename boost::mpl::and_<typename utilities::is_vector<T>, typename utilities::is_vector<U> >::type asdf;
    BOOST_MPL_ASSERT(( boost::is_same<asdf, boost::true_type::value> ));
}

void fooer()
{
    std::vector<int> test1;
    std::vector<int> test2;
    foo(test1, test2);
}

2 个答案:

答案 0 :(得分:1)

BOOST_MPL_ASSERT需要一个元函数谓词,即一个元函数,其返回类型可以解释为“true”或“false”,也就是说,其返回类型例如是boost :: mpl :: true_或boost :: mpl ::假。

如定义的那样,“asdf”类型符合这个要求,所以没有必要针对“true”的任何元编程抽象显式检查它,写BOOST_MPL_ASSERT(( asdf ))完全符合你的要求。

如果你愿意的话,你还可以将它明确地与“true”进行比较,但是你必须将它与boost :: mpl :: true_进行比较,这与boost :: true_type的类型不完全相同期待,因此混乱!

答案 1 :(得分:1)

可能更容易使用C ++ 11:

static_assert(asdf::value, "T and U aren't both vectors!");

或者

static_assert(std::is_same<asdf, boost::true_>::value, "T and U aren't both vectors!");