GCCでは、トリックを使用する必要があります。 cxxabi.h を使用して私はこの目的のために少しラッパーを書いた。
#include <string>
#include <iostream>
#include <iomanip>
#include <typeinfo>
#include <cxxabi.h>
#define DEBUG_TYPE(x) do { typedef void(*T)x; debug_type<T>(T(), #x); } while(0)
template<typename T>
struct debug_type
{
template<typename U>
debug_type(void(*)(U), const std::string& p_str)
{
std::string str(p_str.begin() + 1, p_str.end() - 1);
std::cout << str << " => ";
char * name = 0;
int status;
name = abi::__cxa_demangle(typeid(U).name(), 0, 0, &status);
if (name != 0) { std::cout << name << std::endl; }
else { std::cout << typeid(U).name() << std::endl; }
free(name);
}
};
二重祖父母が必要です。任意のタイプで動作します。
今、あなたはブーストのためにそれを使用することができます:: MPL:
DEBUG_TYPE((if_c<true, true_, false_>::type));
ますプリント:
if_c<true, true_, false_>::type => bool_<true>
は間違いなくマクロの場合である: 'の#define ENABLE_TYPENAME(A)テンプレート<>構造体型名 {静的定数チャー*プレゼント(){#Aを返します。 }}; '。そして、私が 'Foo'クラスを書くときに、' ENABLE_TYPENAME(Foo) 'を実行して、必要に応じて適切な名前空間に入れます。 –
"各タイプごとに異なる"いいえ、あなたはこの保証をもらっていません – icecrime
GCCは、Itanium ABI機能でデングルメントすることができる、Itanium ABIのマングルド名を提供します。 – Puppy