我已经在 boost 邮件列表上问过这个问题,但我似乎不太清楚我的意图。也可能是我不完全理解我如何才能做到这一点。
我想在hana中合并多个 map ,看下面的代码示例:
constexpr auto m1 = hana::make_map(
hana::make_pair("key1"_s, hana::type_c<std::string>),
hana::make_pair("key2"_s, hana::type_c<std::string>)
);
constexpr auto m2 = hana::make_map(
hana::make_pair("key3"_s, hana::type_c<std::string>),
hana::make_pair("key4"_s, hana::type_c<std::string>),
hana::make_pair("key5"_s, hana::type_c<std::string>)
);
constexpr auto m3 = hana::make_map(
hana::make_pair("key6"_s, hana::type_c<std::string>),
hana::make_pair("key7"_s, hana::type_c<std::string>),
hana::make_pair("key8"_s, hana::type_c<std::string>)
);
我已经得到了如何为两张 map 执行此操作的答案:
constexpr auto result = hana::fold_left(m1, m2, hana::insert);
constexpr auto expected = hana::make_map(
hana::make_pair("key1"_s, hana::type_c<std::string>),
hana::make_pair("key2"_s, hana::type_c<std::string>),
hana::make_pair("key3"_s, hana::type_c<std::string>),
hana::make_pair("key4"_s, hana::type_c<std::string>),
hana::make_pair("key5"_s, hana::type_c<std::string>)
);
当我查看文档时,我可以看到 fold_left 需要 2 或 3 个参数。
看起来我需要类似的东西:
fold_left(fold_left(m1, m3, hana::insert), m2, hana::insert);
template<typename Map...>
constexpr auto merge_multiple_maps(Map... args) {
// do something useful here...
}
但是我不确定如何从这里开始,而且我在元编程方面仍然没有那么多经验......
问候, 马蒂斯
最佳答案
首先,定义 merge2
如下:
auto merge2 = [](auto&& m1, auto&& m2) {
return hana::fold_left(std::forward<decltype(m1)>(m1),
std::forward<decltype(m2)>(m2),
hana::insert);
};
然后,将
merge
定义为 merge2
的递归应用:auto merge = [](auto&& m1, auto&& ...ms) {
return hana::fold_left(
hana::make_basic_tuple(std::forward<decltype(ms)>(ms)...),
std::forward<decltype(m1)>(m1),
merge2
);
};
我没有测试这个实现,但它应该给你这个想法。如果你不关心完美转发,你可以去掉所有的
static_cast
;这只是为了运行时效率,以防您在 map 中存储复制成本高但移动成本低的类型。此外,您将无法在 constexpr
上下文中使用它,因为 lambda 不能出现在常量表达式中。这将在 C++17 中修复,但现在您可以很容易地实现与这些 lambda 等效的函数对象。[编辑:Hana 可能会在 future 的某个时候实现这个
merge
函数。] [编辑:使用
std::forward
而不是 static_cast
。] 关于c++ - 合并多个 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39147900/