型IDは、()グラムで余分な文字を返す++
-
16-09-2019 - |
質問
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>
を持っていけないプラットフォーム?
所属していません StackOverflow