Как преобразовать hana::tuple_t с мета-функцией произвольного типа?

Допустим, у меня есть два типа, каждый из которых имеет внутренний тип:

struct A1{
    using type = int;
};
struct B1{
    using type = double;
};

Я создал hana::tuple_t из моих занятий (например, auto Types = hana::tuple_t<A1, B1>) и хотелось бы получить похожее hana::tuple_t из внутренних типов моего класса (например, hana::tuple_t<A1::type, B1::type>)

Я хотел использовать функцию преобразования, чтобы получить результирующий tuple_t:

auto result = hana::transform(Types, [](auto t){return t::type;});

Я получаю ошибку компиляции:

error: ‘t’ is not a class, namespace, or enumeration

Как правильно добиться этого, используя hana::tranform?

1 ответ

Решение

Ты можешь использовать hana::template_

template<typename O>
using inner_type = typename O::type;
auto result = hana::transform(Types, hana::template_<inner_type>);

tuple_t производит tuple, который не может содержать типы. Вместо этого он содержит hana::types, которые являются значениями, которые представляют типы. template_ превращает функцию уровня типа (template введите псевдоним или класс) в метафункцию уровня значения. Если вы хотите использовать явную лямбду для transformможно, но это становится кровавым

auto result = hana::transform(Types, [](auto t) { return hana::type_c<typename decltype(t)::type::type>; })

Тип t в лямбде есть hana::type<T> для некоторых T, так decltype(t) разворачивает этот тип из значения, первый ::type получает T, второй ::type получает ваш тип цели, а type_c оборачивает все это обратно.

Другие вопросы по тегам