Подтвердить что ты не робот

Typeid() возвращает дополнительные символы в g++

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, а не просто foo. Если я изменил код, например

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

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

Любые мысли?

4b9b3361

Ответ 1

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

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

$ c++filt -t P3foo
foo*

Ответ 2

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);

Ответ 3

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

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

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