Как преобразовать 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::type
s, которые являются значениями, которые представляют типы. 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
оборачивает все это обратно.