3

型の名前を読みやすい形式で返すコンパイラ (またはその機能やツールを提供するライブラリ) はありますか。基本的に、私が欲しいのは、ソース コードに記述する型式に対応する文字列です。

4

4 に答える 4

6
 typeid(var).name()

あなたが探しているものです。ただし、出力はコンパイラによって異なります...たとえば、isgccの出力の場合はisの場合です。ここに小さなテストプログラムがあります:intiunsignedj

#include <iostream>
#include <typeinfo>

struct A { virtual ~A() { } };
struct B : A { };

class C { };
class D : public C { };

int main() {
  B b;
  A* ap = &b;
  A& ar = b;
  std::cout << "ap: " << typeid(*ap).name() << std::endl;
  std::cout << "ar: " << typeid(ar).name() << std::endl;

  D d;
  C* cp = &d;
  C& cr = d;
  std::cout << "cp: " << typeid(*cp).name() << std::endl;
  std::cout << "cr: " << typeid(cr).name() << std::endl;

  int e;
  unsigned f;
  char g;
  float h;
  double i;
  std::cout << "int:\t" << typeid(e).name() << std::endl;
  std::cout << "unsigned:\t" << typeid(f).name() << std::endl;
  std::cout << "char:\t" << typeid(g).name() << std::endl;
  std::cout << "float:\t" << typeid(h).name() << std::endl;
  std::cout << "double:\t" << typeid(i).name() << std::endl;
}

この質問も参照してください: typeid(T).name() alternative in c++11?

于 2012-07-29T13:19:14.940 に答える
0

あなたの質問の手紙に答えるために(他の答えがその意図に対処する場合)、最も簡単な答えは、Visual C++が出力として「装飾されていない」(マングルされていない)名前を提供しstd::type_info::name()、実際のマングルされた型をコンパイラ拡張の背後に隠していることstd::type_info::raw_name()です。CPPReference はまた、IBM と Oracle がデマングルされた人間が読める名前を提供していると述べていますが、私は彼らのコンパイラの経験がないため、この主張が正確かどうかはわかりません。

于 2019-08-26T18:19:44.557 に答える