Я запускаю код на 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
Я получаю тот же вывод, что и раньше. Любое другое решение?
Вам нужно использовать c++filt -t
для типов так должно работать следующее:
./shape | c++filt -t
справочная страница по с ++ фильтру говорит следующее для -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 (то есть с некоторыми виртуальными методами, особенно с виртуальным деструктором).