質問

class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

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

コードを印刷の上は、G ++で私のUbuntuマシンののP3foo のを。それはのP3foo を印刷するだけではなくのFOO のいる理由私は得ていないのです。私のようなコードを変更した場合、

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

は、の3foo の印刷します。

任意の考え?

役に立ちましたか?

解決

それがfooへのポインタですので。そして、fooが3つの文字を持っています。だから、P3fooになります。他の一つは、それがfooになるように、3fooを入力しています。テキストは実装依存であることに注意してください、この場合、GCCは、ちょうどあなたの内部、マングルされた名前を与えます。

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

$ c++filt -t P3foo
foo*

他のヒント

std::type_info::name()は実装固有の名前を返します。 GCC 、1つを持っているが私の知る限り、「素敵」名前を取得するには何のポータブルな方法は、ありませんに。 abi::__cxa_demangle() のを見ます。

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

ポータブルソリューションあり

この問題を回避するには、テンプレートがchar*として、すべてのharcodedタイプ名を返すようにハックさせることであろう。

#include <cxxabi.h>を持っていけないプラットフォーム?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top