C++ Filter не деформирует имя типа

Я запускаю код на компиляторе GCC C++, чтобы вывести type_info::name:

#include <iostream>
#include <typeinfo>

using namespace std;

class shape {
   protected:
   int color;
   public:
   virtual void draw() = 0;
   };


class Circle: public shape {
   protected:
   int color;
   public:
   Circle(int a = 0): color(a) {};
   void draw();
   };

   void Circle::draw() {
   cout<<"color: "<<color<<'\n';
   }

class triangle: public shape {
   protected:
   int color;
   public:
   triangle(int a = 0): color(a) {};
   void draw();
   };

   void triangle::draw() {
   cout<<"color: "<<color<<'\n';
   }

int main() {
   Circle* a;
   triangle* b;
   cout<<typeid(a).name()<<'\n';
   cout<<typeid(b).name()<<'\n';
   }

но я получаю следующие результаты:

P6Circle
P8triangle

и на расклад,

./shape | c++filt  

Я получаю тот же вывод, что и раньше. Любое другое решение?

2 ответа

Решение

Вам нужно использовать c++filt -t для типов так должно работать следующее:

./shape | c++filt -t

страница руководства для C++ Filter говорит следующее для -t:

Попытайтесь разобрать типы, а также имена функций. Это отключено по умолчанию, поскольку искаженные типы обычно используются только внутри компилятора, и их можно спутать с не искаженными именами. Например, функция с именем "a", рассматриваемая как искаженное имя типа, будет преобразована в "подписанный символ".

Какую версию GCC (и соответствующую ей libstdC++) вы используете?

С GCC 4.8 у меня есть

static inline std::string 
 demangled_type_info_name(const std::type_info&ti)
{
  int status = 0;
  return abi::__cxa_demangle(ti.name(),0,0,&status);
}

и тогда я могу использовать

std::cout << demangled_type_info_name(typeid(*ptr)) << std::endl;

где ptr указывает на некоторый объект с RTTI (то есть с некоторыми виртуальными методами, особенно с виртуальным деструктором).

Другие вопросы по тегам