Преобразование статического типа в строку в C ++ с помощью gcc

Это тот же вопрос, что и Можно ли напечатать тип переменной в стандартном C ++? но я не хочу RTTI. Я пишу код с помощью шаблонов выражений (например, Eigen), что означает, что типы моих переменных могут быть действительно задействованы, и что я не знаю фактических типов. Тем не менее, компилятор знает типы и может сказать мне, когда что-то пойдет не так:

error: ‘const struct Eigen::EigenBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >’ ...

Можно ли как-то преобразовать имя переменной в строку с именем (статического) типа, чтобы можно было отлаживать программу, не нарушая ее? Например.

int a;
M b;
cout << TYPEOF(a) << endl << TYPEOF(b) << endl;

будет печатать

int
const struct Eigen::EigenBase<Eigen::Matrix<double, 1, 1, 0, 1, 1> >’

3

Решение

typeid может применяться к типу (5.2.8p4):

std::cout << typeid(int).name() << '\n'
<< typeid(M).name() << '\n';

Это не связано с накладными расходами во время выполнения.

3

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

станд :: соиЬ << TypeId (интермедиат) .name () << «\ П»
<< TypeId (М) .name () << ‘\ П’;

3

Я отметил https://stackoverflow.com/a/13703184/1693829 как ответ, спасибо! Это обертка, которую я написал:

#include <cxxabi.h>
#include <string>

template <typename T>
std::string t2s(T tt) {
char *name;
int status;
name = abi::__cxa_demangle(typeid(tt).name(), 0, 0, &status);
std::string namestring(name);
free(name);
return namestring;
}
1
По вопросам рекламы [email protected]