如何加入两个或多个boost融合图?

时间:2014-09-29 11:47:08

标签: c++ boost boost-fusion

我想从两个boost::fusion::map类型创建associative sequence。其中一个映射中包含的类型可能存在于另一个映射中,如果是这种情况,我希望最终只得到一个在生成的序列中具有该键的类型。也就是说,我希望在加入后是唯一的。

传统的join操作似乎允许重复键,因此它似乎不是一个解决方案。有谁知道我怎么能做到这一点?

// 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, "");

1 个答案:

答案 0 :(得分:3)

您可能需要手动根除欺骗行为:完整的c ++ 14档Live On Coliru

auto r = 
    as_map(
        fold(
            fold(m1, m2, [](auto accum, auto elem) { return erase_key<typename decltype(elem)::first_type>(accum); }),
            m1, 
            [](auto accum, auto elem) { return insert(accum, boost::fusion::end(accum), elem); }
        )); 

那很时髦。如果用冒号而不是lambdas替换它,你最终会类似于:

auto r = 
    as_map(
        fold(
            fold(m1, m2, erase_corresponding()), 
            m1, 
            insert_helper()
        ));

一个简单的实现 Live On Coliru 仍然倾向于初步的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);
        }
};

然而,为了使所有c ++ 03证明,您需要使用RESULT_OF拼写出来(我将其作为练习留给读者)