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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top