Я недавно изучаю авто особенность C ++ 11/14.
В образовательных целях я хотел бы явно отобразить результат вывода типа моего кода.
Я попытался typeid (). Name (), но я обнаружил две проблемы с этим подходом.
@ πάνταῥεῖ Я пытался использовать abi :: __cxa_demangle (), которую вы указали.
Проблема 1 решена, спасибо, но typeid (). Name (), похоже, не содержит информации модификатора CV.
Я думаю, что есть некоторые подводные камни, использующие auto
ключевое слово, поэтому я хотел бы увидеть точный результат вывода типа, включая модификатор CV и ссылочный тип.
Я использую clang 6.1.0 на Mac OS 10.10.3, но я хотел бы знать переносимый способ сделать это, если это возможно.
Попробуйте подход, предложенный Скоттом Мейерсом (Effective Modern C ++):
Объявите шаблон (но не определяйте его)
template<typename T> // declaration only for TD;
class TD; // TD == "Type Displayer"
Затем создайте экземпляр этого шаблона, используя ваш тип
TD<decltype(x)> xType
Компилятор теперь будет жаловаться на этот неполный тип (и обычно будет отображать его полное имя)
ошибка: агрегат ‘TD< int> xType ‘имеет неполный тип и не может быть определен
См. Пункт 4 «Эффективного современного C ++» (обычно я бы предложил эту книгу как «обязательно читать»)
Библиотека указателей типов недавно был добавлен в 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&