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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top