gpt4 book ai didi

c++ - 插入的项目从 boost::mpl::map 中消失

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:01 25 4
gpt4 key购买 nike

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

    #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 不会删除插入的元素?

最佳答案

我确信这是 boost::mpl 中的错误.

将元素插入 mpl::map 的结果不是 mpl::map 类型的项目但是 mpl::m_item .这m_item保存新插入的键和值以及它们插入的映射。
现在每个类(class)在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> >这就是为什么所有插入的项目都消失了。

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

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

关于c++ - 插入的项目从 boost::mpl::map 中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17393496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com