C++ではコンパイルされてしまえば型情報はなくなります。例えばインスタンスからそのクラス名を取得することはできません。C++/CLIでは、型情報はなんでも取得できます。
最も簡単な型情報の取得はtypeidキーワードを使っておこないます。
using namespace System; int main() { Type^ t = String::typeid; Console::WriteLine(t->FullName); Console::WriteLine(t->AssemblyQualifiedName); return 0; }
型情報はクラスtypeを使ってアクセスします。
インスタンスからtypeを得るには、ObjectのメソッドであるGetType()を利用します。
using namespace System; void showType(Object^ o) { Type^ t = o->GetType(); Console::WriteLine(t->FullName); Console::WriteLine(t->AssemblyQualifiedName); } ref class C { int a; }; int main() { String^ s = L"ABC"; showType(s); int i = 0; showType(i); C^ c = gcnew C; showType(c); array<C^>^ ar = gcnew array<C^>(10); showType(ar); return 0; }
Type::GetType(String)を使用すれば、任意の名前からTypeを取得できます。
using namespace System; int main() { Type^ t1 = Type::GetType("System.Console"); return 0; }
Type::GetType()に渡す文字列は、AssemblyQualifiedNameというものを指定します。この場合ネームスペースの区切り文字はコロンではなくピリオドになります。
Typeクラスは同じクラスに対して常に同じインスタンスを返すことを保障しています。よって==などでTypeクラスのハンドルを比較し、同じ型かどうか調べることができます。