0

我正在尝试在我的代码中使用 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);
}
4

2 回答 2

1

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

根据定义,“asdf”类型满足此要求,因此无需针对任何元编程抽象显式检查它是否为“true”,编写BOOST_MPL_ASSERT(( asdf ))完全符合您的要求。

当然,如果您愿意,您也可以将其显式与“true”进行比较,但是您必须将其与 boost::mpl::true_ 进行比较,这与您可能期望的 boost::true_type 的类型不完全相同,因此混乱!

于 2013-09-01T15:59:19.567 回答
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!");
于 2013-09-05T17:33:27.203 回答