typeid() возвращает дополнительные символы в g ++
-
16-09-2019 - |
Вопрос
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Приведенный выше код печатает P3foo на моей машине Ubuntu с g ++.Я не понимаю, почему это печатается P3foo вместо того, чтобы просто фу.Если я изменю код следующим образом
std::cout << typeid(*this).name() << std::endl;
он печатает 3foo.
Есть какие-нибудь мысли?
Решение
Потому что это указатель на foo.И foo имеет 3 символа.Таким образом, это становится P3foo
.У другого есть тип foo
, так что это становится 3foo
.Обратите внимание, что текст зависит от реализации, и в этом случае GCC просто выдает вам внутреннее искаженное имя.
Введите это искаженное имя в программу c++filt
чтобы получить незапутанное имя:
$ c++filt -t P3foo
foo*
Другие советы
std::type_info::name()
возвращает конкретное имя реализации.AFAIK, нет переносимого способа получить "красивое" имя, хотя GCC имеет один.Посмотрите на abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
Есть ли портативное решение
обходным решением было бы взломать шаблон, чтобы возвращать все закодированные имена типов как char*
на какой платформе нет #include <cxxabi.h>
?