Можно ли запретить отбрасывать ссылочную часть в typeid().name() ? C++
Я хочу вывести в консоль полный тип переменной. Проблема в том, что typeid().name() выводит лишь базовый тип, отбрасывая модификаторы const и ссылочную часть. Можно ли как-то это поправить и вывести полностью например:
int x = 10;
const int& rx = x;
std::cout << typeid(rx).name() << std::endl; // Хочется, чтобы вывело const int&, а не int
Ответы (1 шт):
Напрямую нельзя. Можно сделать пустой шаблон а-ля template <typename T> struct A {};, и печатать имя A<decltype(rx)>.
Учитывайте, что typeid(...).name() возвращает красивое человеко-читаемое имя только в MSVC. В GCC и Clang вы получите mangled имя.
Поэтому более надежный способ вот такой:
template <typename T>
const char *TypeName()
{
#ifdef _MSC_VER
return __FUNCSIG__;
#else
return __PRETTY_FUNCTION__;
#endif
}
На моем Clang-е, TypeName<decltype(rx)>() возвращает const char *TypeName() [T = const int &].
Домашнее задание - научиться вынимать имя типа из возвращаемой строки, автоматически определяя сколько символов отбросить в начале и в конце.
На 5 с плюсом - делать это во время компиляции, чтобы лишние части строки не попадали в скомпилированную программу.