我使用Boost MPL和C ++ 03,我在计算存储在另一个mpl :: vector中的mpl :: vector的长度时遇到了问题。对于这个简单的例子,外部向量包含3个内部向量,并且每个内部向量仅包含1个条目,即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> ));
我在第二个断言中收到错误,即:
错误:没有函数模板的实例&#34; mpl _ :: assertion_failed&#34; 匹配参数列表
参数类型是:(mpl _ :: failed ************升压:: MPL ::等于&LT;升压:: MPL :: v_item&LT; MPL _ :: long_&LT; 1L&gt;,boost :: mpl :: v_item&lt; MPL _ :: long_&LT; 1L&gt;中 升压:: MPL :: v_item&LT; MPL _ :: long_&LT; 1L&gt;,boost :: mpl :: vector0&lt; mpl _ :: na&gt;,0&gt ;, 0&gt;,0&gt ;,bool :: mpl :: vector3_c&lt; int,1,1,1>,boost :: is_same&lt; MPL _ :: , MPL :: _&GT;&GT; :: ************)
我在这里做错了什么?
编辑:我发现长度似乎正确计算,因为以下断言成功:
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 > ));
所以问题在于断言声明。
答案 0 :(得分:1)
jv_向我指出答案,可以找到here(感谢Andy Little)。基本上我在上面的所有代码中都使用了mpl :: equal。 mpl :: equal使用mpl :: is_same(默认的第三个模板参数),它检查类型是否完全相同。我需要为mpl :: equal,mpl :: equal_to提供第三个模板参数,以便逐个比较积分常量的值。最后的断言声明如下:
BOOST_MPL_ASSERT(( mpl::equal<lengths, mpl::vector_c<int, 1, 1, 1>::type, mpl::equal_to<mpl::_1, mpl::_2> >));