2015-09-21 5 views
3

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

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 like I did? Или есть другой способ?

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

} 
+1

Складные последовательность клавиш с 'at' функции вы презентовать вряд ли имеет смысл. Это имеет смысл только в том случае, если последовательность ключей у вас есть '[key1, ..., keyN]' и ваша карта имеет форму 'map >>'. И тогда результат вашего 'fold_left' будет' value', что, вероятно, не так, как вы ожидаете. Следовательно, не могли бы вы объяснить, что вы на самом деле пытаетесь достичь, и, возможно, я мог бы пролить свет на лучший способ сделать это? Вы пытаетесь получить список карт (которые являются значениями внутри мультимары), связанных с каждым ключом в последовательности 'keys'? –

+0

На самом деле я ожидаю, что вы объяснили в своих первых трех предложениях. Таким образом, есть ключи '[key1, ..., keyN]' и карта формы 'map >>' и я хотел бы получить '& value'. Я опубликовал предыдущие решения как обновление выше, но мне нужно использовать кортежи вместо пакетов параметров. Поэтому использование ханы. – erikzenker

+0

Извините, что неверно истолковал ваш вопрос. См. Мой ответ ниже. –

ответ

5

Я исправил две ошибки, которые препятствовали правильному использованию вашего прецедента. Вот минимальный полный пример, который в настоящее время работает на мастера:

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

Отлично! Благодарим вас за помощь. Ваша работа над ханой блестящая! – erikzenker

+0

Рад, что я мог помочь. Спасибо, что попробовали библиотеку! –

+0

'using namespace hana;' может сделать это немного легче читать – TemplateRex