Прежде всего, включите RTTI.
В противном случае, если вам действительно * действительно * нужно получить строковое представление типа без него, с небольшими манипуляциями со строкамии внимательно изучите тот факт, что вы пишете нестандартный код, который может сломаться, если вы обновите GCC, измените платформы или воспользуетесь другим набором параметров, возможно, вы сможете его подделать.
#include <iostream>
#include <string>
std::string extract_type_name(const char* s) {
//add logic her
return s;
}
template<typename T>
std::string type_name() {
static std::string s = extract_type_name(__PRETTY_FUNCTION__);
return s;
}
int main() {
std::cout << type_name<int>() << " " << type_name<std::string>() << std::endl;
}
Вывод этой функции на ideone:
std::string type_name() [with T = int]
std::string type_name() [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]
Если предположить, что __PRETTY_FUNCTION__
ведет себя так же, если RTTI выключен, вырвать бит T = blah
не должно быть слишком сложно.
Кроме того, имейте в виду, что typeid(blah).name()
предлагает очень мало гарантий ... Я помню, как использовал его на одной платформе, где результат для любого определенного пользователем типа был просто struct
.Не слишком полезно.Полагаться на это легко даже при включенном RTTI [что вы должны делать в любом случае].