【问题标题】:Convert static type to string in C++ with gcc使用 gcc 在 C++ 中将静态类型转换为字符串
【发布时间】:2012-11-22 01:12:35
【问题描述】:

这与Is it possible to print a variable's type in standard 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> >’

【问题讨论】:

  • 相关(可能重复):stackoverflow.com/questions/8001207/…
  • @John 不是真的重复:这个问题更多的是对另一个问题的跟进。
  • @KonradRudolph:请再次检查我链接的问题。
  • @John 我做到了。看看答案。事实上,接受的答案直接说你需要一些宏观绒毛来解决这个问题——这导致我们来到这里。
  • @KonradRudolph:对不起,我不明白这个问题的哪一部分没有被 OP 链接的问题和我链接的问题的组合所涵盖?

标签: c++ gcc typeof


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    std::cout

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-04-14
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        • 2012-06-21
        • 2013-01-23
        • 1970-01-01
        相关资源
        最近更新 更多