このmain.cpp
を実行するとどうなりますか:
#include <iostream>
#include <typeinfo>
using namespace std;
struct Blah {};
int main() {
cout << typeid(Blah).name() << endl;
return 0;
}
GCCバージョン4.4.4でコンパイルすることにより:
g++ main.cpp
私はこれを得る:
4Blah
Visual C++ 2008では、次のようになります。
struct Blah
Blah
またはstruct Blah
だけを印刷する方法はありますか?
name
の戻り値は実装定義です。実装は、異なるタイプの異なる文字列を返す必要さえありません。
G ++から得られるものは 装飾名 です。これは c++filt
コマンドまたは __cxa_demangle
。
返される文字列は実装定義です。
Gccがやっていることは、マングルされた名前を返すことです。
c ++ filtを使用して、マングルされた名前をプレーンテキストに変換できます。
> a.out | c++filt
印刷する方法はありますか
Blah
または_struct Blah
_?
いいえ。std::typeinfo::name()
の結果は指定されていません。さらに、すべての型に対して同じ文字列(または、実際、すべての型に対して空の文字列)を返す可能性があり、実装は依然として標準に準拠しています。その結果に頼ってはいけません。本当に、私が便利だと思ったのはデバッグだけでした。
必要なものを教えてください。多くの場合、代わりに特性が使用されます。
他の人が言ったように、ここでの結果はimplementation-definedです。つまり、実装(つまり、コンパイラツールチェーン)は、どこかに文書化されている限り、自由に定義できます。
C++標準のセクション18.5.1/1 [lib.type.info]から:
クラス
type_info
は、実装によって生成される型情報を記述します。このクラスのオブジェクトは、タイプの名前へのポインターと、2つのタイプの同等性または照合順序の比較に適したエンコード値を効果的に格納します。型の名前、エンコード規則、および照合順序はすべて指定されておらず、プログラムによって異なる場合があります。
typeid().name()
は実装依存です。すべてのタイプに対して空の文字列を返すこともあります。これはあまり有用な実装ではありませんが、有効です。
4Blahでは、4はクラス名の文字数です。たとえば、クラス名がmyEmptyClassの場合、12myEmptyClassが出力されます。