c++ - typeid() devuelve caracteres extra en g++
name-mangling (3)
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
El código anterior imprime P3foo en mi máquina ubuntu con g ++. No entiendo por qué está imprimiendo P3foo en lugar de solo foo . Si cambio el código como
std::cout << typeid(*this).name() << std::endl;
imprime 3foo .
¿Alguna idea?
¿Hay una solución portátil?
la solución sería hacer un truco de plantilla para devolver todos los nombres de tipo codificados como char*
¿ #include <cxxabi.h>
plataforma no tiene #include <cxxabi.h>
?
Porque es un puntero a foo. Y foo tiene 3 personajes. Así se convierte en P3foo
. El otro tiene tipo foo
, por lo que se convierte en 3foo
. Tenga en cuenta que el texto depende de la implementación, y en este caso, GCC solo le da el nombre interno y mutilado.
Ingrese ese nombre mutilado en el programa c++filt
para obtener el nombre no enredado:
$ c++filt -t P3foo
foo*
std::type_info::name()
devuelve un nombre específico de implementación. AFAIK, no hay una forma portátil de obtener un nombre "bonito", 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);