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