typeid () devuelve caracteres adicionales en g ++
-
16-09-2019 - |
Pregunta
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Por encima de código imprime P3foo en mi máquina ubuntu con g ++. No estoy recibiendo por ello que se imprime P3foo en lugar de sólo foo . Si cambio el código como
std::cout << typeid(*this).name() << std::endl;
imprime 3foo .
¿Alguna idea?
Solución
Debido a que es un puntero a foo. Y foo tiene 3 caracteres. Por lo tanto, se convierte en P3foo
. El otro es de tipo foo
, por lo que se convierte en 3foo
. Tenga en cuenta que el texto es dependiente de la implementación, y en este caso GCC sólo te da el, nombre revuelto interna.
Introduzca ese nombre mutilado en el c++filt
programa para obtener el nombre unmangled:
$ c++filt -t P3foo
foo*
Otros consejos
std::type_info::name()
devuelve un nombre específico de aplicación. Que yo sepa, no hay ninguna manera portátil para conseguir un "buen" nombre, aunque GCC tiene uno . Mira abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
¿Hay una solución portátil
solución sería hacer una plantilla truco para devolver todos los nombres de los tipos harcoded como char*
qué plataforma no tiene #include <cxxabi.h>
?