Повысьте хана fold_left lamba call по ссылке

Я хочу пройти через мультикарту (карту карт), например: map<int,map<char, string>> с помощью буста хана. Функция ламба at не может взять ссылочный тип &map (ошибка компиляции: неконстантная ссылка), поэтому я не могу загрузить или сохранить элементы в мультикарте.

   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:

Предыдущее решение без хана нуждаются в пакетах параметров. Но мне нужна функция, которая принимает ключи как кортеж.

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];

}

3

Решение

Я исправил две ошибки, из-за которых ваш вариант использования не работал должным образом. Вот
минимальный полный пример, который в настоящее время работает на мастере:

#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);
}
5

Другие решения