ポインタからクラス名を調べる方法

c++で、ポインタからクラス名や型名を調べる処理は、以下の2ステップで実現できます

  • typeid(obj).name() で型名の文字列を取る
  • abi::__cxa_demangle() で demangle する

サンプルコードは以下の通り

#include <typeinfo>
#include <cxxabi.h>

#include <iostream>

int 
main()
{
  class MyClass {
     int value;
  };
  MyClass *ptr = new MyClass;

  size_t len = 64;
  char *buf = new char[len];
  buf = abi::__cxa_demangle(typeid(*ptr).name(), buf, &len,NULL) 
  std::cout << buf << std::endl;
  delete[] buf;
  delete ptr;
  return 0;
}

実行すると

main::MyClass

と出力されます

abi::__cxa_demangle() には第2引数にNULLを渡す使い方もありますが、NULLを渡す方法では free() を呼ばないとメモリリークします。上記コードの buf[]の様に事前にメモリを確保して、それを第2引数で渡す方が、コードがシンプルに書けます

参考URL