型名をデマングルする

毎回デマングルの方法を調べて使うのがめんどうなので、ラップした。デバッグ用。環境ごとに型名を統一的な表記にすることは目的にしていない。

libstdc++とlibc++の環境で、abi::__cxa_demangle()関数を使って型名をデマングルする。メモリリークしないように、かつ例外安全にしてある。

宣言:

// <shand/demangle_typename.hpp>
namespace shand {
    template <class T>
    std::string demangle_typename();
}

サンプル:

#include <iostream>
#include <vector>
#include <shand/demangle_typename.hpp>

int main()
{
    std::cout << shand::demangle_typename<int>() << std::endl;
    std::cout << shand::demangle_typename<std::vector<int>>() << std::endl;
}

出力例:

int
std::vector<int, std::allocator<int> >