1

実行時に型情報を出力する必要がある場合は、常に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_stringoperator<<タイプリストの内容を再帰的にストリームに出力するために実装するクラス テンプレートです。(関係のないメタプログラミング コードで記事が肥大化しないように、これは含めません) .

これはdemangling なしで完全に機能します。デマングリングを実装するためにインクルード<cxxabi>すると、コンパイラは にambiguous reference to __gnu_gxx namespaceエラーを表示しsstream.hます。

その理由は何ですか?

4

0 に答える 0