typeid () restituisce caratteri supplementari in g ++
-
16-09-2019 - |
Domanda
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Sopra stampe codice P3foo sulla mia macchina Ubuntu con g ++. Non ricevo il motivo per cui la fase di stampa P3foo invece di foo . Se cambio il codice come
std::cout << typeid(*this).name() << std::endl;
la stampa 3foo .
Qualche idea?
Soluzione
Perché è un puntatore a foo. E foo ha 3 caratteri. Così diventa P3foo
. L'altro è di tipo foo
, così diventa 3foo
. Si noti che il testo è a carico di attuazione, e in questo caso GCC appena ti dà il, nome storpiato interna.
Inserisci quel nome storpiato nel c++filt
programma per ottenere il nome unmangled:
$ c++filt -t P3foo
foo*
Altri suggerimenti
std::type_info::name()
restituisce un nome specifico di attuazione. Per quanto ne so, non c'è modo portatile per ottenere un nome di "bella", anche se GCC ha uno . Guardate abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
C'è una soluzione portatile
soluzione alternativa sarebbe quella di fare un modello hack per restituire tutti i nomi di tipo harcoded come char*
quale piattaforma non hanno #include <cxxabi.h>
?