ふつうなら typeid(*p).name() で済むんだけど、gccとかだとゴミが付くのでそれをなんとかするという話
#include <iostream> #include <typeinfo> // classname用 #include <cxxabi.h> // classname用 using namespace std; class Hoge { public: virtual ~Hoge(){} virtual const char* classname() { int a; return abi::__cxa_demangle( typeid(*this).name(), 0, 0, &a ); } }; class Piyo : public Hoge {}; int main() { Hoge *p = new Piyo; cout << "my name is " << p->classname() << endl; return 0; }
$ ./a.out my name is Piyo
gdbで見るときは、set print object on する
(gdb) p p $1 = (Hoge *) 0x602010 (gdb) set print object on (gdb) p p $2 = (Piyo *) 0x602010
ポインタの型を見ても普通は役に立たないから .gdbinit に書いとくことにした