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


person chila    schedule 22.03.2016    source источник


Ответы (1)


Это действительно сложно. Hana предоставляет унарный оператор плюс для hana::type, который превращает любой hana::type с указанием ссылки в rvalue. Итак, в основном,

#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.

person Louis Dionne    schedule 22.03.2016
comment
По этой причине типы предоставляют перегрузку унарного оператора +, который можно использовать для преобразования lvalue в rvalue. Таким образом, при использовании результата, который может быть ссылкой на объект типа, можно использовать +, чтобы убедиться, что значение r получено до извлечения его вложенного ::type. Спасибо! - person chila; 22.03.2016