Перебор boost::hana::tuple

Я не мог найти способ получить доступ к реальному объекту с hana::for_each итерацией по кортежам.

struct A {
  std::string name;
}

struct B {
  std::string name;
}

using type_t = decltype(boost::hana::tuple_t<A, B>);
type_t names;

boost::hana::for_each(names, [&](const auto& a) {
      std::cout << a.name << std::endl;
    });

Тип a выглядит как hana::tuple_impl<...> и, по-видимому, не может быть приведен к базовому типу decltype(std::decay_t<a>)::type.

В основном я хочу перебрать список шаблонных объектов (контейнеров), которые имеют одинаковый интерфейс, но содержат разные значения. Приветствуются лучшие способы достижения этого.


person Etherealone    schedule 04.10.2016    source источник
comment
Сомневаюсь в этом decltype(boost::hana::tuple_t<A, B>). Что это значит? Разве tuple_t<A,B> не является типом?   -  person Nawaz    schedule 04.10.2016
comment
В документации @Nawaz говорится, что его использование похоже на это auto types = hana::tuple_t<int*, char&, void>; Так что я думаю, что это шаблон переменной С++ 14. boost.org/doc/libs/1_61_0/ libs/hana/doc/html/index.html   -  person Etherealone    schedule 04.10.2016


Ответы (1)


tuple_t для кортежа hana::types. Вам нужно tuple обычных объектов, а это всего лишь tuple:

boost::hana::tuple<A, B> names;
boost::hana::for_each(names, [&](const auto& x) {
    std::cout << x.name << std::endl;
});
person Barry    schedule 04.10.2016
comment
Это работает. Можете ли вы немного уточнить, когда использовать типы хана и для чего они нужны? Документация немного вводит в заблуждение. Это говорит о том, что я должен обернуть объекты (которые не являются целыми, tuple_c для интегралов) в hana_types, а tupe_t — это простой способ сделать это. - person Etherealone; 04.10.2016
comment
@Etherealone tuple_t<Ts...> примерно является оболочкой для tuple<type_c<Ts>...>. Вы используете его, когда хотите type_cs. - person Barry; 04.10.2016
comment
Спасибо. Я не знаю, понял ли я это, но похоже, что я бы использовал tuple_t для работы с типами в стиле MPL (hana работает с объектами типа hana_type и позволяет нам работать с реальными типами C++ через эти объекты (значения) ). И обычный кортеж предназначен для обычного использования объекта. - person Etherealone; 04.10.2016
comment
@Etherealone Да, это оно. - person Louis Dionne; 05.10.2016
comment
@LouisDionne О, привет, Луи :) - person Barry; 05.10.2016