typeid () retorna caracteres adicionais em g ++
-
16-09-2019 - |
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?
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>
?