Frage

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

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

Über Code druckt P3foo auf meinem Ubuntu-Rechner mit g ++. Ich erhalte nicht, warum es druckt P3foo statt nur foo . Wenn ich den Code wie

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

druckt 3foo .

Alle Gedanken?

War es hilfreich?

Lösung

Weil es ein Zeiger auf foo ist. Und foo hat 3 Zeichen. So wird es P3foo. Der andere hat foo geben, so wird es 3foo. Beachten Sie, dass der Text ist die Umsetzung abhängig, und in diesem Fall GCC gibt Ihnen nur die internen, verstümmelten Namen.

Geben Sie diesen verstümmelten Namen in das Programm c++filt den unmangled Namen zu bekommen:

$ c++filt -t P3foo
foo*

Andere Tipps

std::type_info::name() gibt eine Implementierung bestimmten Namen. AFAIK gibt es keine portable Möglichkeit, einen „schönen“ Namen zu erhalten, obwohl GCC man hat . Schauen Sie sich abi::__cxa_demangle() .

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

Gibt es eine portable Lösung

Abhilfe wäre eine Vorlage zu machen hacken alle harcoded Typnamen als char* zurückzukehren

, welche Plattform #include <cxxabi.h> nicht haben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top