とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

デマングル(demangle, デマングリング, demangling)する関数

デマングルする関数書いてみた。車輪の再発明?おいしいよ (^^) あ,今は GCC 限定だよ。

概要

demangle はデマングルした文字列を返す。
マングル(mangle, マングリング, mangling)された文字列,型, type_infoのいずれかを受け取り変換することができる。
あなたが暗黒面に落ちてよいのであれば,なんとtypeidを省略できる。悪しきマクロを唱えることにより, decltype のように demangle を使える。この demangle は不思議なことに型バージョンの demangle とちゃんと区別される。

サンプル・使い方

#include<iostream>
#include<sscrisk/demangle.hpp>

int main()
{
 using sscrisk::demangle;
 std::cout << demangle<int>() << std::endl;
 std::cout << demangle<std::string::value_type>() << std::endl;
 std::cout << demangle(typeid(0 + 0U + 0L + 0UL + 0.0F + 0.0)) << std::endl;
 std::cout << demangle(typeid(main)) << std::endl;

#define demangle(e) SSCRISK_DEMANGLE(e) // ここから暗黒面に落ちる
 std::cout << demangle<int>() << std::endl; // なぜかOK.
 std::cout << demangle<std::string::value_type>() << std::endl;
 std::cout << demangle(0 + 0U + 0L + 0UL + 0.0F + 0.0) << std::endl; // decltypeのように使える
 std::cout << demangle(main) << std::endl;
#undef demangle
}
実行結果:
int
char
double
int ()
int
char
double
int ()

ソース sscrisk/demangle.hpp

demangle — Gist

「不思議なことに」とは言ったけど,もちろんタネも仕掛けもありますw