Использование предстоящих средств отражения C ++ для печати полного имени типа - PullRequest
0 голосов
/ 23 сентября 2018

В настоящее время можно использовать __PRETTY_FUNCTION__ для отображения типа шаблона в gcc, а clang:

#include <iostream>

template <class T>
void print_type() {
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main(int argc, char* argv[]) {
  print_type<const volatile int&>();
  return 0;
}

Будет выводить:

void print_type() [with T = const volatile int&]

С рефлексия TS средства прихода и рефлексии в C ++, мне было интересно, как будет выглядеть синтаксис, чтобы иметь возможность делать что-то подобное.

Примечание: поскольку за рефлексию TS еще не проголосовали,Я ищу только «вероятный» синтаксис.

1 Ответ

0 голосов
/ 23 сентября 2018

Гадание примерно так:

template <class T>
void print_type() {
    using F = reflexpr(print_type<T>);
    std::cout << get_display_name_v<F> << std::endl;
}

Вы должны reflexpr конкретную вещь, нет способа получить "эту функцию, в которой я нахожусь" - так что это print_type<T>.А затем в документации просто говорится, что это определенная реализация.

Если вы хотите записать все это, вы можете сделать:

template <class T>
void print_type() {
    std::cout << "void "
              << get_name_v<reflexpr(print_type<T>)> // guaranteed "print_type"
              << "() [with T = "
              << get_display_name_v<reflexpr(T)> 
              << "]" << std::endl;
}

Мне неясно, что на самом деле является get_name_v<reflexpr(const volatile int&)>.Кажется, что это, вероятно, пусто - T не является спецификатором простого типа * в этом случае ), и нет упоминаний о cv- или ref-определителях, поэтому я использовал get_display_name_v.

Обратите внимание, что TS Reflection основывается на типах - каждый reflexpr дает вам тип, в котором вы должны выполнять метапрограммирование на основе типов. Подход, который, скорее всего, сам язык закончится, будет value отражение на основе - то есть reflexpr дает значение небольшого набора предопределенных типов объектов отражения.Это облегчит на самом деле кодирование, и именно поэтому мы работаем над constexpr! и поддерживаем распределение constexpr в работах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...