3

这与是否可以在标准 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> >’
4

3 回答 3

3

typeid可以应用于一个类型(5.2.8p4):

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

这不涉及任何运行时开销。

于 2012-12-04T12:43:07.720 回答
3

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

于 2012-12-06T18:06:19.023 回答
1

我将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;
}
于 2012-12-04T13:30:59.837 回答