19
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を出力します。fooだけでなくP3fooを出力する理由がわかりません。次のようにコードを変更した場合

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

3fooを出力します。

何かご意見は?

4

3 に答える 3

31

fooへのポインタだからです。そしてfooは3文字です。だからP3foo。もう1つはタイプfooなので、になり3fooます。テキストは実装に依存していることに注意してください。この場合、GCCは内部のマングルされた名前を提供するだけです。

そのマングルされた名前をプログラムに入力して、マングルされていない名前c++filtを取得します。

$ c++filt -t P3foo
foo*
于 2009-04-25T18:01:24.103 に答える
17

std::type_info::name()実装固有の名前を返します。私の知る限り、「素敵な」名前を取得する移植可能な方法はありませんが、GCCには. を見てくださいabi::__cxa_demangle()

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
于 2010-02-07T14:04:52.730 に答える
0

ポータブルソリューションはありますか

回避策は、テンプレート ハックを作成して、ハードコードされたすべての型名を次のように返すことです。char*

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

于 2010-10-15T18:10:35.070 に答える