C++ 如何连接两个或多个boost fusion贴图?

C++ 如何连接两个或多个boost fusion贴图?,c++,boost,boost-fusion,C++,Boost,Boost Fusion,我想从两个boost::fusion::map类型创建一个。其中一个映射中包含的类型可能存在于另一个映射中,如果是这种情况,我只希望在结果序列中使用该键的单个类型。也就是说,我希望键在加入后是唯一的 传统的操作似乎允许复制密钥,因此它似乎不是一个解决方案。有人知道我是如何做到这一点的吗 // Here is what I've got: using namespace boost::fusion; map< pair<int, int>, pair<double,

我想从两个
boost::fusion::map
类型创建一个。其中一个映射中包含的类型可能存在于另一个映射中,如果是这种情况,我只希望在结果序列中使用该键的单个类型。也就是说,我希望键在加入后是唯一的

传统的操作似乎允许复制密钥,因此它似乎不是一个解决方案。有人知道我是如何做到这一点的吗

// Here is what I've got:
using namespace boost::fusion;
map<
  pair<int, int>,
  pair<double, int>> Map1;

map<
  pair<bool, int>,
  pair<double, int>> Map2;

// I want to join Map1 with Map2 such that I have
static_assert(std::is_same<Map3, map<
  pair<int, int>,
  pair<double, int>,
  pair<bool, int>>>::value, "");
//这是我得到的:
使用名称空间boost::fusion;
地图<
一对
配对>Map1;
地图<
一对
配对>Map2;
//我想把Map1和Map2连接起来,这样我就可以
静态断言(std::is_same>::value,“”);

您可能需要手动消除重复:使用c++14档全速运行

一个简单的实现仍然依赖于初步的c++1y支持:

 struct erase_corresponding {
    template<typename T, typename U> 
        auto operator()(T map, U elem) const {
            return boost::fusion::erase_key<typename U::first_type>(map);
        }
};

struct insert_helper {
    template<typename T, typename U> 
        auto operator()(T map, U elem) const {
            return boost::fusion::insert(map, boost::fusion::end(map), elem);
        }
};
struct erase\u对应{
模板
自动运算符()(T映射,U元素)常量{
返回boost::fusion::擦除_键(map);
}
};
结构插入辅助对象{
模板
自动运算符()(T映射,U元素)常量{
返回boost::fusion::insert(map,boost::fusion::end(map),elem);
}
};

然而,为了使它成为c++03的全部证明,您需要用结果(我留给读者作为练习)

刚刚意识到第二个折叠现在可以简化为一个简单的连接:)
auto r = 
    as_map(
        fold(
            fold(m1, m2, erase_corresponding()), 
            m1, 
            insert_helper()
        ));
 struct erase_corresponding {
    template<typename T, typename U> 
        auto operator()(T map, U elem) const {
            return boost::fusion::erase_key<typename U::first_type>(map);
        }
};

struct insert_helper {
    template<typename T, typename U> 
        auto operator()(T map, U elem) const {
            return boost::fusion::insert(map, boost::fusion::end(map), elem);
        }
};