Boost hana fold_left lambda调用的引用

Boost hana fold_left lambda call by reference

本文关键字:调用 引用 lambda left hana fold Boost      更新时间:2023-10-16

我想在boost hana的帮助下遍历一个multimap (map of maps),例如:map<int,map<char, string>>。lambda函数at不能接受引用类型&map(编译错误:非const引用),因此,我不能在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);
}