【问题标题】:Idiomatic way of assigning element of boost::mpl vector_c at index在索引处分配 boost::mpl vector_c 元素的惯用方式
【发布时间】:2012-06-15 09:54:03
【问题描述】:

我有

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;

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

【问题讨论】:

    标签: c++ metaprogramming boost-mpl


    【解决方案1】:

    我从未使用过 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 谓词。我没有找到这样的,

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

    3) 我会推荐最后一个答案:让 MPL 作者添加一些名为 replace_at...

    HTH, 彼得·尼茨

    【讨论】:

    • 在调用元函数时使用 typename [...]::type 是惯用的,所以我并不认为这是 OP 实现的默认设置:直到 MPL 作者决定使用模板别名来消除对这种丑陋的需求语法,最好(恕我直言)坚持下去,以保持一致。不过,我同意你其余的回答。
    • @LucTouraille 你说得对,我没有注意到 typename 对于 MPL 的东西也是必需的。
    • @PiotrNycz 感谢您的回答!一开始,我尝试使用一些预定义的算法,例如 MPL.fold,但过了一段时间后我意识到无论如何我都需要在某个地方创建一个“assign_at_pos”元函数。可能,实现这一目标的最有效(编译方式)方法只是定义 n*(n+1)/2 部分特化来处理向量长度不超过 n 的所有情况......在这种情况下 boost.preprocessor 是你朋友!我实际上需要这样做才能将assign_element的实际返回类型转换回vector_c ...
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多