4

我有

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;

该解决方案有效,但正如您所见,它非常复杂(涉及迭代器、高级......)。这个用例是否存在更简单且可能有效的解决方案?提前致谢!

4

1 回答 1

2

我从未使用过 MPL,但它看起来很有趣,我看了一下文档。这是我的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<3> 谓词。我没有找到这样的,

2)你的回答是正确的。你封装了它 - 所以用法是一行。在谈论易用性时,用法很重要 - 而不是实现,考虑采取一些努力从用法行中删除这个烦人的类型名。也许你的 assign_element<> 应该从 mpl::insert<> 派生?或者考虑在 C++11 中使用“使用”的方式来删除 typedef ...

3)我会推荐最后一个答案:Ask MPL Author(s) to add something called replace_at...

HTH,彼得·尼茨

于 2012-06-23T14:33:42.583 回答