Typeid() возвращает дополнительные символы в g++
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, а не просто foo. Если я изменил код, например
std::cout << typeid(*this).name() << std::endl;
он печатает 3foo.
Любые мысли?
Ответы
Ответ 1
Потому что это указатель на foo. И foo имеет 3 символа. Таким образом, он становится P3foo
. Другой имеет тип foo
, поэтому он становится 3foo
. Обратите внимание, что текст зависит от реализации, и в этом случае GCC просто дает вам внутреннее, искаженное имя.
Введите это искаженное имя в программу c++filt
, чтобы получить незанятое имя:
$ c++filt -t P3foo
foo*
Ответ 2
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);
Ответ 3
Есть ли переносное решение
обходным путем было бы заставить шаблон взломать, чтобы вернуть все имена привязанных типов как char*
какая платформа не имеет #include <cxxabi.h>
?