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_string是一个类模板,它实现operator<<了将类型列表的内容递归地打印到流中。(我不包括它是为了不使用不相关的元编程代码使帖子膨胀)

这可以完美地工作而无需拆解。当我包括<cxxabi>实现解构时,编译器ambiguous reference to __gnu_gxx namespacesstream.h.

可能是什么原因?

4

0 回答 0