hana::second не может вывести тип
Я пытаюсь получить доступ к hana::type
из пары, использующей hana::second
...
namespace hana = boost::hana;
using namespace hana::literals;
struct Key {};
struct Foo {};
int main() {
auto test = hana::make_tuple(
hana::make_pair(
hana::type_c<Key>,
hana::type_c<Foo>));
typename decltype(hana::type_c<Foo>)::type finalTest; //Ok
typename decltype(hana::second(test[0_c]))::type finalTest2; //Error
}
Но я получаю следующую ошибку компилятора:
stacktest.cpp: In function ‘int main()’:
stacktest.cpp:17:12: error: decltype evaluates to ‘boost::hana::type_impl<Foo>::_&’, which is not a class or enumeration type
typename decltype(hana::second(test[0_c]))::type finalTest2;
Почему результат hana::second
не вернуть содержимое hana::type
как и ожидалось?
1 ответ
Сообщение об ошибке гласит, что decltype оценивается как boost::hana::type_impl<Foo>::_&
который немного загадочно выглядит, вы можете увидеть по &
в конце концов, это ссылка на содержащийся hana::type
, К сожалению, ссылка не будет содержать членов, которые вы ожидаете найти в необработанном виде.
За это hana::type
обеспечивает одинарный operator+
это просто разыменовывает необработанный тип, так что вы можете сделать следующее:
typename decltype(+hana::second(test[0_c]))::type finalTest2;
hana::typeid_
работает для этого, а также идемпотентно оборачивает любое значение в hana::type
с константными и референсными классификаторами:
typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2;
Стоит отметить, что все следующие функции Hana возвращают ссылки:
first
, second
, at
, at_key
и связанные operator[]
,