Как преобразовать hana :: tuple_t с мета-функцией произвольного типа? - PullRequest
0 голосов
/ 14 декабря 2018

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

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 Ответ

0 голосов
/ 14 декабря 2018

Вы можете использовать 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 оборачивает все обратно.

...