Вопрос

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

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

Приведенный выше код печатает P3foo на моей машине Ubuntu с g ++.Я не понимаю, почему это печатается P3foo вместо того, чтобы просто фу.Если я изменю код следующим образом

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

он печатает 3foo.

Есть какие-нибудь мысли?

Это было полезно?

Решение

Потому что это указатель на foo.И foo имеет 3 символа.Таким образом, это становится P3foo.У другого есть тип foo, так что это становится 3foo.Обратите внимание, что текст зависит от реализации, и в этом случае GCC просто выдает вам внутреннее искаженное имя.

Введите это искаженное имя в программу c++filt чтобы получить незапутанное имя:

$ c++filt -t P3foo
foo*

Другие советы

std::type_info::name() возвращает конкретное имя реализации.AFAIK, нет переносимого способа получить "красивое" имя, хотя GCC имеет один.Посмотрите на abi::__cxa_demangle().

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

Есть ли портативное решение

обходным решением было бы взломать шаблон, чтобы возвращать все закодированные имена типов как char*

на какой платформе нет #include <cxxabi.h>?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top