читаемый человеком type_info.name ()

Я скомпилировал следующий код с g++, и получил вывод, который написан в комментариях.

template<class T>
void foo(T t) { cout << typeid(t).name() << endl; }

int main() {
foo("f");       //emits "PKc"foo(string());  //emits "Ss"}

Я знаю это type_info.name() не стандартизирован, но есть ли способ получить удобочитаемые результаты?

Было бы неплохо что-то вроде следующего

const char *
class string

8

Решение

Ты можешь использовать аби :: __ cxa_demangle для этого (функция demangle, взятая из Вот), просто помните, что вызывающая сторона отвечает за освобождение возврата:

#include <cxxabi.h>
#include <typeinfo>
#include <iostream>
#include <string>
#include <memory>
#include <cstdlib>

std::string demangle(const char* mangled)
{
int status;
std::unique_ptr<char[], void (*)(void*)> result(
abi::__cxa_demangle(mangled, 0, 0, &status), std::free);
return result.get() ? std::string(result.get()) : "error occurred";
}

template<class T>
void foo(T t) { std::cout << demangle(typeid(t).name()) << std::endl; }

int main() {
foo("f");            //char const*
foo(std::string());  //std::string
}

Пример на ideone.

15

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]