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?

¿Fue útil?

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>?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top