Доступ к типам tuple_t

У меня есть этот код:

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? Там должно быть менее громоздким способом.

1

Решение

Это действительно сложно. Хана предоставляет унарный оператор плюс на 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.

3

Другие решения

Других решений пока нет …