2

以下示例说明了我的意思:

    #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通过访问update2::type我插入的项目进行评估时消失。

为什么会发生这种情况,我该怎么做才能确保评估update2不会删除插入的元素?

4

1 回答 1

2

我确信这是boost::mpl.

将元素插入 an 的结果mpl::map不是 type 的项,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的实际上是map::type

这意味着我插入后的示例(int_<>为简洁起见删除)如下所示:

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

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

我记录了一个错误,最初是在发布这个答案之前等待回复,但 4 周后我决定在没有他们任何答案的情况下发布这个。

解决方案是简单地添加typedef m_item type;boost::mpl::m_itemin boost/mpl/map/aux_/item.hpp。这将创建m_item一个正确返回自身而不返回原始映射的元函数。

于 2013-07-26T11:50:47.480 回答