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> >::************)

では、次のように記述して assert を渡すにはどうすればよいでしょうか。

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 に答える