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を教えていただきました。より高水準なライブラリとして、こちらを使ってみるのも良さそうです。
demangleを使うよりは、Boost.TypeIndexのpretty_name()を使う方がいいと思いますよ。デマングルした型名の整形までやってくれるので。
— Akira Takahashi (@cpp_akira) November 20, 2016
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Boostで型名をデマングルする