typeid () renvoie des caractères supplémentaires en g ++
-
16-09-2019 - |
Question
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Au-dessus de code affiche P3foo sur ma machine ubuntu avec g ++. Je ne reçois pas pourquoi il est l'impression P3foo au lieu de simplement foo . Si je change le code comme
std::cout << typeid(*this).name() << std::endl;
il imprime 3foo .
Toutes les pensées?
La solution
Parce qu'il est un pointeur vers foo. Et foo a 3 caractères. Ainsi, il devient P3foo
. L'autre est de type foo
, il devient 3foo
. Notez que le texte dépend de l'implémentation, et dans ce cas GCC vous donne juste le nom interne, mutilée.
Entrez ce nom mutilée dans le c++filt
du programme pour obtenir le nom non substantypés:
$ c++filt -t P3foo
foo*
Autres conseils
std::type_info::name()
retourne une implémentation nom spécifique. Autant que je sache, il n'y a aucun moyen portable pour obtenir un nom « agréable », bien que GCC a un . Regardez abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
Y at-il une solution portable
solution serait de faire un modèle hack pour retourner tous les noms de type harcoded comme char*
quelle plate-forme n'avez pas #include <cxxabi.h>
?