我在C++03中使用Boost MPL,计算存储在另一个mpl::向量中的mpl::向量的长度存在问题。对于这个简单的例子,外部向量包含3个内部向量,而每个内部向量仅包含一个条目,即mpl::int_<0>。我使用的代码如下:
struct ComputeLengths
{
template <typename vectorOfVectors> struct apply
{
typedef typename mpl::transform
<
vectorOfVectors,
mpl::size<mpl::_1>
>::type type;
};
};
BOOST_MPL_ASSERT(( boost::mpl::equal<vectorOfVectors, mpl::vector<mpl::vector_c<int, 0>, mpl::vector_c<int, 0>, mpl::vector_c<int, 0> >::type> ));
typedef typename ComputeLengths::template apply<vectorOfVectors>::type lengths;
BOOST_MPL_ASSERT(( boost::mpl::equal<lengths, mpl::vector_c<int, 1, 1, 1>::type> ));在第二个断言中,我得到了一个错误,即:
错误:函数模板"mpl_::assertion_failed“的实例与参数列表不匹配 参数类型有:(mpl_::failed ************boost::mpl::equal< boost::mpl::v_item< mpl_::long_< 1L>,boost::mpl::vector0< mpl_::na>,0>,0>,0>,boost::mpl::vector3_c< int,1,1,0>,boost::is_same< mpl_::,mpl::_>>::************)
我在这里做错什么了?
编辑:当以下断言成功时,我发现长度计算似乎是正确的:
BOOST_MPL_ASSERT(( boost::mpl::equal< typename mpl::size<vectorOfVectors>::type, typename mpl::int_<3>::type > ));
BOOST_MPL_ASSERT(( boost::mpl::equal< typename mpl::at<vectorOfVectors, mpl::int_<0> >::type, typename mpl::int_<1>::type > ));
BOOST_MPL_ASSERT(( boost::mpl::equal< typename mpl::at<vectorOfVectors, mpl::int_<1> >::type, typename mpl::int_<1>::type > ));
BOOST_MPL_ASSERT(( boost::mpl::equal< typename mpl::at<vectorOfVectors, mpl::int_<2> >::type, typename mpl::int_<1>::type > ));所以问题在于断言语句。
发布于 2016-03-24 14:20:27
jv_向我指出了答案,答案可以找到这里 (多亏了Andy )。基本上,我在上面的所有代码中都不正确地使用了mpl::equal。相等使用mpl::is_same (默认的第三个模板参数),它检查类型是否完全相同。我需要向mpl提供第三个模板参数::equal,mpl::equal_to,以便将积分常量的值逐一进行比较。最后的assert语句如下所示:
BOOST_MPL_ASSERT(( mpl::equal<lengths, mpl::vector_c<int, 1, 1, 1>::type, mpl::equal_to<mpl::_1, mpl::_2> >));https://stackoverflow.com/questions/36184065
复制相似问题