Как я могу явно просмотреть результаты вывода типа автоматически?

Я недавно изучаю авто особенность C ++ 11/14.

В образовательных целях я хотел бы явно отобразить результат вывода типа моего кода.
Я попытался typeid (). Name (), но я обнаружил две проблемы с этим подходом.

  1. Вывод иногда трудно понять. (Например, «NSt3__16vectorIiNS_9allocatorIiEEEE»)
  2. модификаторы const / volatile не отображаются.

@ πάνταῥεῖ Я пытался использовать abi :: __cxa_demangle (), которую вы указали.
Проблема 1 решена, спасибо, но typeid (). Name (), похоже, не содержит информации модификатора CV.
Я думаю, что есть некоторые подводные камни, использующие auto ключевое слово, поэтому я хотел бы увидеть точный результат вывода типа, включая модификатор CV и ссылочный тип.

Я использую clang 6.1.0 на Mac OS 10.10.3, но я хотел бы знать переносимый способ сделать это, если это возможно.

5

Решение

Попробуйте подход, предложенный Скоттом Мейерсом (Effective Modern C ++):

Объявите шаблон (но не определяйте его)

template<typename T>       // declaration only for TD;
class TD;                  // TD == "Type Displayer"

Затем создайте экземпляр этого шаблона, используя ваш тип

TD<decltype(x)> xType

Компилятор теперь будет жаловаться на этот неполный тип (и обычно будет отображать его полное имя)

ошибка: агрегат ‘TD< int> xType ‘имеет неполный тип и не может быть определен

См. Пункт 4 «Эффективного современного C ++» (обычно я бы предложил эту книгу как «обязательно читать»)

7

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

Библиотека указателей типов недавно был добавлен в Boost. Он пытается решить некоторые из упомянутых вами проблем.

Пример:

cout << boost::typeindex::type_id<int const volatile*>().pretty_name() << endl;
cout << boost::typeindex::type_id_with_cvr<int const&>().pretty_name() << endl;

Печать:

int const volatile*
int const&
5

По вопросам рекламы [email protected]