当我需要在运行时打印类型信息时,我总是对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>
实现解构时,编译器ambiguous reference to __gnu_gxx namespace
在sstream.h
.
可能是什么原因?