Как извлечь типы из boost :: hana :: tuple_t? - PullRequest
0 голосов
/ 14 декабря 2018

Я использую hana:tuple_t для хранения и получения списка типов:

auto Types = hana::tuple_t<int, double>;
auto first_t = Types[hana::int_c<0>];
static_assert(std::is_same_v<decltype(first_t)::type, int>); // line 3

Приведенный выше код работает правильно, однако, когда я пытался заменить переменную first_t ее действительным выражением:

static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>); //line 4

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

template argument 1 is invalid
     static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>);
 error: decltype evaluates to ‘const boost::hana::type_impl<int>::_&’, which is not a class or enumeration type

Строка 3 и строка 4 приведенного выше кода эквивалентны, почему я получаю ошибку компиляции для строки 4:

1 Ответ

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

decltype(Types[hana::int_c<0>]) - это const ссылка на boost::hana::type_impl<int>::_, и вы не можете запросить ссылку , чтобы получить ::type из ссылки d type.

first_t объявляется только с auto, и это удаляет ссылку и константность.Если вы хотите сохранить это (в другой ситуации), вы можете объявить его auto & first_t = ....

static_assert(std::is_same_v<decltype(first_t), boost::hana::type_impl<int>::_>);

Вы можете использовать std::decay_t, чтобы избавиться от ссылки.

static_assert(std::is_same_v<
    std::decay_t<decltype(Types[hana::int_c<0>])>::type, int>);
...