8

type_info::name を出力するために、GCC C++コンパイラでコードを実行しています。

#include <iostream>
#include <typeinfo>

using namespace std;

class shape {
   protected:
   int color;
   public:
   virtual void draw() = 0;
   };


class Circle: public shape {
   protected:
   int color;
   public:
   Circle(int a = 0): color(a) {};
   void draw();
   };

   void Circle::draw() {
   cout<<"color: "<<color<<'\n';
   }

class triangle: public shape {
   protected:
   int color;
   public:
   triangle(int a = 0): color(a) {};
   void draw();
   };

   void triangle::draw() {
   cout<<"color: "<<color<<'\n';
   }

int main() {
   Circle* a;
   triangle* b;
   cout<<typeid(a).name()<<'\n';
   cout<<typeid(b).name()<<'\n';
   }

しかし、次の結果が得られます。

P6Circle
P8triangle

そしてデマングルでは、

./shape | c++filt  

以前と同じ出力が得られます。他の解決策はありますか?

4

2 に答える 2

12

for タイプを使用する必要があるc++filt -tため、以下が機能するはずです。

./shape | c++filt -t

c++filtのマニュアルページには、 について次のように書かれています-t

関数名だけでなく型も分解しようとします。マングルされた型は通常、コンパイラの内部でのみ使用され、マングルされていない名前と混同される可能性があるため、これはデフォルトで無効になっています。たとえば、マングルされた型名として扱われる "a" という関数は、"signed char" にデマングルされます。

于 2013-09-25T13:06:33.697 に答える
2

どのバージョンの GCC (およびそれに対応するlibstdc++ ) を使用していますか?

GCC 4.8 では、

static inline std::string 
 demangled_type_info_name(const std::type_info&ti)
{
  int status = 0;
  return abi::__cxa_demangle(ti.name(),0,0,&status);
}

そして、私は使用することができます

std::cout << demangled_type_info_name(typeid(*ptr)) << std::endl;

ここで、 RTTI (つまり、いくつかの仮想メソッド、特に仮想デストラクタ) を持つptrオブジェクトを指します。

于 2013-09-25T13:08:30.420 に答える