У меня есть этот код:
auto myTuple = hana::tuple_t<int, char*, long>;
std::cout << boost::typeindex::type_id<decltype(myTuple[1_c])>().pretty_name() << std::endl;
Это выводит:
boost::hana::type_impl<char*>::_
Я хочу получить доступ к типу ‘char *’, но если я это сделаю:
std::cout << boost::typeindex::type_id<decltype(myTuple[1_c])::type>().pretty_name() << std::endl;
Это выводит:
error: 'decltype(myTuple[1_c])' (aka 'boost::hana::type_impl<char *>::_ &') is not a class, namespace, or scoped enumeration
std::cout << boost::typeindex::type_id<decltype(myTuple[1_c])::type>().pretty_name() << std::endl
Это потому, что это ссылка, если я делаю:
std::cout << boost::typeindex::type_id<decltype(boost::hana::traits::remove_reference(myTuple[1_c]))::type>().pretty_name() << std::endl;
Затем он выводит ‘char *’.
Это способ доступа к типам tuple_t? Там должно быть менее громоздким способом.
Это действительно сложно. Хана предоставляет унарный оператор плюс на hana::type
который разлагается любой реф квалифицированный hana::type
к значению. В общем,
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
auto myTuple = hana::tuple_t<int, char*, long>;
using T = decltype(+myTuple[1_c])::type;
// ^~~~~ notice unary plus here
Также обратите внимание, что вы можете быть заинтересованы в использовании hana::experimental::print
от <boost/hana/experimental/printable.hpp>
, Это экспериментальная (следовательно, нестабильная) функция, но я могу заверить вас, что она должна в конечном итоге попасть в библиотеку, в той или иной форме:
#include <boost/hana.hpp>
#include <boost/hana/experimental/printable.hpp>
#include <iostream>
namespace hana = boost::hana;
int main() {
auto myTuple = hana::tuple_t<int, char*, long>;
std::cout << hana::experimental::print(myTuple) << std::endl;
}
Выход:
(type<int>, type<char*>, type<long>)
редактировать: Оператор унарный плюс задокументирован в ссылка на hana::type
.
Других решений пока нет …