Pergunta

class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

int main()
{
  foo f;;
  f.say_type_name();
}

Acima código imprime P3foo na minha máquina ubuntu com g ++. Eu não estou recebendo por isso que está a imprimir P3foo em vez de apenas foo . Se eu alterar o código como

    std::cout << typeid(*this).name() << std::endl;

imprime 3foo .

Qualquer pensamento?

Foi útil?

Solução

Porque é um ponteiro para foo. E foo tem 3 caracteres. Assim torna-se P3foo. O outro tem o tipo foo, por isso se torna 3foo. Note-se que o texto é dependente de implementação, e neste caso GCC apenas lhe dá o nome interno, mutilado.

Digite esse nome mutilado no c++filt programa para obter o nome unmangled:

$ c++filt -t P3foo
foo*

Outras dicas

std::type_info::name() retorna um nome específico de implementação. AFAIK, não há nenhuma maneira portátil para obter um nome "legal", embora GCC tem uma . Olhada abi::__cxa_demangle() .

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);

Existe uma solução portátil

solução alternativa seria fazer um hack modelo para retornar todos os nomes de tipo harcoded como char*

qual plataforma não tem #include <cxxabi.h>?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top