通过引用提升 hana fold_left lamba 调用
Boost hana fold_left lamba call by reference
我想在 boost hana 的帮助下遍历 multimap(地图的地图),例如:map<int,map<char, string>>
。 Lamba 函数 at
不能采用引用类型 &map
(编译错误:非常量引用),因此,我无法在 multimap 中加载或存储元素。
template <typename T_Map, typename T_Tuple>
auto& traverse(T_Map &map, T_Tuple &keys){
auto at = [](auto &map, auto key) -> auto& {
return map[key];
};
return hana::fold_left(keys, map, at);
}
是否可以像我一样用 boost::hana 解决这个问题?或者还有其他方法吗?
更新 1:
上一个没有 hana 的解决方案需要参数包。但是我需要一个接受键作为元组的函数。
template <typename T_Map, typename T, typename... Ts>
auto& traverse(T_Map &map, T key, Ts... keys){
return traverse(map[key], keys...);
}
template <typename T_Map, typename T>
auto& traverse(T_Map& map, T key){
return map[key];
}
我修复了两个导致您的用例无法正常工作的错误。这是
当前适用于 master 的最小完整示例:
#include <boost/hana/at_key.hpp>
#include <boost/hana/fold_left.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/map.hpp>
#include <boost/hana/pair.hpp>
#include <boost/hana/range.hpp>
#include <cassert>
namespace hana = boost::hana;
auto at = [](auto& map, auto key) -> auto& {
return map[key];
};
template <typename Map, typename Keys>
auto& traverse(Map& map, Keys const& keys){
return hana::fold_left(keys, map, at);
}
int main() {
auto xs = hana::make_map(hana::make_pair(hana::int_c<0>,
hana::make_map(hana::make_pair(hana::int_c<1>,
hana::make_map(hana::make_pair(hana::int_c<2>,
hana::make_map(hana::make_pair(hana::int_c<3>, 10))))))));
int& i = traverse(xs, hana::range_c<int, 0, 4>);
assert(i == 10);
i = 99;
assert(traverse(xs, hana::range_c<int, 0, 4>) == 99);
}
我想在 boost hana 的帮助下遍历 multimap(地图的地图),例如:map<int,map<char, string>>
。 Lamba 函数 at
不能采用引用类型 &map
(编译错误:非常量引用),因此,我无法在 multimap 中加载或存储元素。
template <typename T_Map, typename T_Tuple>
auto& traverse(T_Map &map, T_Tuple &keys){
auto at = [](auto &map, auto key) -> auto& {
return map[key];
};
return hana::fold_left(keys, map, at);
}
是否可以像我一样用 boost::hana 解决这个问题?或者还有其他方法吗?
更新 1:
上一个没有 hana 的解决方案需要参数包。但是我需要一个接受键作为元组的函数。
template <typename T_Map, typename T, typename... Ts>
auto& traverse(T_Map &map, T key, Ts... keys){
return traverse(map[key], keys...);
}
template <typename T_Map, typename T>
auto& traverse(T_Map& map, T key){
return map[key];
}
我修复了两个导致您的用例无法正常工作的错误。这是 当前适用于 master 的最小完整示例:
#include <boost/hana/at_key.hpp>
#include <boost/hana/fold_left.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/map.hpp>
#include <boost/hana/pair.hpp>
#include <boost/hana/range.hpp>
#include <cassert>
namespace hana = boost::hana;
auto at = [](auto& map, auto key) -> auto& {
return map[key];
};
template <typename Map, typename Keys>
auto& traverse(Map& map, Keys const& keys){
return hana::fold_left(keys, map, at);
}
int main() {
auto xs = hana::make_map(hana::make_pair(hana::int_c<0>,
hana::make_map(hana::make_pair(hana::int_c<1>,
hana::make_map(hana::make_pair(hana::int_c<2>,
hana::make_map(hana::make_pair(hana::int_c<3>, 10))))))));
int& i = traverse(xs, hana::range_c<int, 0, 4>);
assert(i == 10);
i = 99;
assert(traverse(xs, hana::range_c<int, 0, 4>) == 99);
}