Это тот же вопрос, что и Можно ли напечатать тип переменной в стандартном 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> >’
typeid
может применяться к типу (5.2.8p4):
std::cout << typeid(int).name() << '\n'
<< typeid(M).name() << '\n';
Это не связано с накладными расходами во время выполнения.
станд :: соиЬ << TypeId (интермедиат) .name () << «\ П»
<< TypeId (М) .name () << ‘\ П’;
Я отметил 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;
}