在索引处分配boost :: mpl vector_c元素的惯用法

时间:2012-06-15 09:54:04

标签: c++ metaprogramming boost-mpl

我有

mpl::vector_c<int, 0, 1, 2, 3, 4, 5>

我用魔杖'分配'位置3的元素,说我想把它设置为30.因此,我必须写 元函数取和索引,向量和新值并返回修改后的序列。 我最终得到了以下解决方案

template <int k, class sequence, class value>
class assign_element
{
            typedef typename mpl::begin<sequence>::type begin;
            typedef typename mpl::advance<begin, mpl::int_<k> >::type pos;
            typedef typename mpl::erase <sequence, pos>::type sequence2;

            typedef typename mpl::begin<sequence2>::type begin2;
            typedef typename mpl::advance<begin2, mpl::int_<k> >::type pos2;
public:
            typedef typename mpl::insert <sequence2, pos2, value>::type type;
};

然后我按如下方式使用

typedef mpl::vector_c<int, 0, 1, 2, 3, 4, 5> sequence;
typedef typename assign_element<3, sequence, mpl::int_<30> >::type result;

这个解决方案有效,但正如你所看到的那样(涉及迭代器,提前......)。 这个用例有一个更简单,可能有效的解决方案吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

我从未使用过MPL,但它看起来很有趣,我看一下doc。在这里我的3个答案,我希望这可以帮助你:

1)错误的答案 - 但是找到合适的答案可能是一个好的开始。你考虑使用replace_if吗?

typedef vector_c<int, 0, 1, 2, 3, 4, 5> sequence;
typedef replace_if< numbers, equal_to<_,int_<3> >, int_<30> >::type result;

你需要一个at_pos&lt; 3&gt;谓语。我没有找到这样的,

2)你回答是正确的。你封装了它 - 所以使用是一行。在谈论简易性时,使用很重要 - 而不是实现,考虑花一些力气从使用行中删除这个烦人的类型名称。也许你的assign_element&lt;&gt;应来自mpl :: insert&lt;&gt;?或者考虑在C ++ 11中使用“using”来删除typedef ...

3)我会建议最后一个答案:要求MPL作者添加名为replace_at的内容...

HTH, Piotr Nycz