当我需要在运行时打印类型信息时,我总是将demangling应用于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<<
以递归方式将类型列表的内容打印到流中。 (我不包括它以免膨胀与非相关元编程代码的帖子)。
完全无需解码。当我包含<cxxabi>
来实现demangling时,编译器会在ambiguous reference to __gnu_gxx namespace
中显示sstream.h
错误。
可能是什么原因?