GCCやClangでtypeinfo::name()の結果を分かりやすい名前に変換(デマングル)するにあたり、Boostに便利なクラス・関数があります。

まずは、scoped_demangled_nameクラスです。std::type_infoから構築し、getメンバー関数でデマングルした文字列が得られるというものです。

#include <iostream>
#include <typeinfo>
#include <boost/core/demangle.hpp>
 
int main()
{
  // コンストラクタには、const std::type_info&型の仮引数が1つある。
  boost::core::scoped_demangled_name name(typeid(int).name());
  if (name.get())
  {
    std::cout << name.get() << std::endl;
  }
  else
  {
    std::cout << "不明" << std::endl;
  }
}

このほか、std::string型で返すboost::core::demangle関数もあります。こっちは条件判定が要りません。変換失敗時は元の文字列をそのままstd::stringに変換する実装になっています。もちろん、std::stringコンストラクタがstd::bad_allocなどを投げる可能性はあります。

#include <iostream>
#include <typeinfo>
#include <boost/core/demangle.hpp>
 
int main()
{
  // demangle関数もconst std::type_info&型の仮引数が1つある。
  std::cout << boost::core::demangle(typeid(int).name()) << std::endl;
}

内部の実装は、もちろんabi::__cxa_demangleです。

  • RAII化されており、freeを忘れる心配不要(自作するだけでなく、Boostを使うという選択肢が生まれた)。
  • GCCおよびClang以外とのポータビリティが得られる。その他の環境では、実引数で与えられたポインタをそのまま返す実装となっている。そのため、Visual C++などでも、上記のコードがそのまま実行可能。

現在の形になったのはBoost 1.56からです。ドキュメントは最近までありませんでしたが、現在はdemangleにあります。

2016年11月23日追記:Boost.TypeIndexを教えていただきました。より高水準なライブラリとして、こちらを使ってみるのも良さそうです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Boostで型名をデマングルする