使用Boost MPL计算向量的长度

时间:2016-03-23 16:47:21

标签: c++ templates boost

我使用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 > ));

所以问题在于断言声明。

1 个答案:

答案 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> >));