【问题标题】:inserted items disappear from boost::mpl::map插入的项目从 boost::mpl::map 中消失
【发布时间】:2013-06-30 18:25:33
【问题描述】:

下面的例子说明了我的意思:

    #include <boost/mpl/map.hpp>
    #include <boost/mpl/for_each.hpp>
    #include <boost/mpl/pair.hpp>
    #include <boost/mpl/at.hpp>
    #include <boost/mpl/insert.hpp>
    #include <iostream>

    using namespace boost::mpl;

    template <int n1, int n2>
    struct entry
    {
        typedef pair<int_<n1>, int_<n2> > type;
    };

    typedef map<entry<1,1>::type> entries;

    typedef insert<
        entries, entry<4,4>::type>::type update;

    typedef insert<
        update,
        entry<5,5>::type>::type update2;

    struct print_values
    {
        template <class I>
        void operator()(I)
        {
            std::cout << first<I>::type::value << ", " 
                      << second<I>::type::value << std::endl;
        }
    };

    int main()
    {
        for_each<update2>(print_values());
        std::cout << "Next:" << std::endl;
        for_each<update2::type>(print_values());
    }

输出:

    1, 1
    4, 4
    5, 5
    Next:
    1, 1

当我通过访问update2::type 评估update2 时,我插入的项目消失了。

为什么会发生这种情况,我可以做些什么来确保评估 update2 不会删除插入的元素?

【问题讨论】:

    标签: c++ boost-mpl


    【解决方案1】:

    我确信这是boost::mpl 中的一个错误。

    将元素插入mpl::map 的结果不是mpl::map 类型的项目,而是mpl::m_item。这个m_item 包含新插入的键和值以及它们插入的映射。
    现在boost::mpl 中的每个类都是一个元函数,容器是一个返回自身的元函数。这对于这种情况很有用

        typedef map<pair<int,int> > i_map;
        eval_if<true_,
                i_map,
                at<i_map, float> >::type type;
    

    所以mpl::map 里面有一个typedef,它只是typedef map type;m_item,但是缺少这个typedef,所以因为它派生自map,所以它被插入到m_item::type实际上是@987654335 @。

    这意味着插入后的示例(为简洁起见,删除 int_&lt;&gt;)如下所示:

       m_item<5, 5, m_item<4, 4, map1<pair<1, 1> > > >
    

    并且访问它的类型一直返回到map1&lt;pair&lt;1, 1&gt; &gt;::type,它返回map&lt;pair&lt;1, 1&gt; &gt;,这就是所有插入的项目都消失的原因。

    我记录了bug,最初在发布此答案之前等待回复,但 4 周后我决定在没有他们任何答复的情况下发布此内容。

    解决方案是在boost/mpl/map/aux_/item.hpp 中简单地将typedef m_item type; 添加到boost::mpl::m_item。这将使m_item 成为正确返回自身而不返回原始地图的元函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多