実行時に型情報を出力する必要がある場合は、常にstd::type_info::name()
結果にデマングリングを適用します。これは、以下を使用する GCC の実装ですabi::__cxa_demangle()
。
#include <cxxabi.h>
GCC demangling implementation
std::string demangle( const std::string& name )
{
int status;
return std::string( abi::__cxa_demangle( name.c_str() , 0 , 0 , &status ) );
return name;
}
今日はto_string
、タイプリストの内容を印刷できるテンプレートを書いていました。したがって、std::string
連結を避けるために、文字列ストリームを使用しましたstd::ostringstream
。
template<typename T>
struct to_string_t
{
operator std::string()
{
return demangle( typeid( T ).name() );
}
};
template<typename... Ts>
struct to_string_t<mpl::list<Ts...>>
{
operator std::string()
{
std::ostringstream os;
os << '[' << _to_string<mpl::list<Ts...>>() << ']';
return os.str();
}
};
_to_string
operator<<
タイプリストの内容を再帰的にストリームに出力するために実装するクラス テンプレートです。(関係のないメタプログラミング コードで記事が肥大化しないように、これは含めません) .
これはdemangling なしで完全に機能します。デマングリングを実装するためにインクルード<cxxabi>
すると、コンパイラは にambiguous reference to __gnu_gxx namespace
エラーを表示しsstream.h
ます。
その理由は何ですか?