Когда мне нужно напечатать информацию о типе во время выполнения, я всегда применяю 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>
чтобы реализовать деминглинг, компилятор показывает ambiguous reference to __gnu_gxx namespace
ошибка в sstream.h
,
Что может быть причиной?
Задача ещё не решена.
Других решений пока нет …