揮発性のメモ2

http://d.hatena.ne.jp/iww/

クラス名を表示する

ふつうなら 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 に書いとくことにした