2009-04-25 9 views
17
class foo 
{ 
public: 
    void say_type_name() 
    { 
    std::cout << typeid(this).name() << std::endl; 
    } 
}; 

int main() 
{ 
    foo f;; 
    f.say_type_name(); 
} 

++グラムで余分な文字を返します。私はなぜP3fooの代わりにfooの代わりに印刷しているのか分かりません。私は型IDは、()のコードプリントグラムと私のUbuntuマシンで<em>P3foo</em> ++上

std::cout << typeid(*this).name() << std::endl; 

のようにコードを変更した場合には、3fooを印刷します。

どのような考えですか?

答えて

31

これはfooへのポインタであるためです。そしてfooは3文字です。したがって、それはP3fooになります。もう1つはタイプfooなので、3fooになります。このテキストは実装に依存していることに注意してください。この場合、GCCは内部的に変更された名前を与えます。

はunmangled名を取得するためのプログラム c++filtにそのマングルされた名前を入力します。

$ c++filt -t P3foo 
foo* 
+0

WOW!面白い。さらに2つの質問.. 1 - C++ filtはgccディストリビューションの一部かLINUXの一部ですか? 2 - メソッドやクラスの名前を取得する方法はありますか? –

+0

C++ filtはbinutils(ld(リンカー)とreadelfのような他の小さなutilも入っているパッケージ)の一部です:http://www.gnu.org/software/binutils/ –

+5

それをC++でやってください。しかし、GCCでは、これを行うABIによって公開された機能があります。それはcxxabi.hにあり、__cxa_demangleと呼ばれています。それを混乱した名前だけに渡してください。そのインターフェイスはこのABIに従います:http://www.codesourcery.com/public/cxx-abi/abi.html#demangler –

17

std::type_info::name()は実装固有の名前を返します。 AFAIK、GCCのhas oneが、 "いい"名前を取得する移植可能な方法はありません。 abi::__cxa_demangle()を見てください。

int status; 
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status); 
std::cout << realname; 
free(realname); 
+0

ありがとう!私の現在のプロジェクトでは大きな助けとなりました。 –

0

問題を回避するには、テンプレートが#include <cxxabi.h>を持っていけないどのプラットフォーム

char*として、すべてのharcodedタイプ名を返すようにハックさせることであろうポータブルソリューションがありますか?

+1

クラス自体( 'whoami()'メソッドのような)を特別にサポートしなければ、 "テンプレートハック"は* dynamic *型ではなく* static *型しか出力できません(多態性基底クラスへのポインタを考えてください)。 –

+0

Qtは、メタオブジェクトシステムに非常に良い反射メカニズムを提供します。私はそれを強く勧めます。 –

関連する問題