我想从两个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, "");
答案 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拼写出来(我将其作为练习留给读者)