typeid
演算子によって、プログラムは、ポインターまたは参照により参照されるオブジェクトの実際の派生型を検索することができます。
この演算子は、dynamic_cast 演算子とともに、C++ における RTTI (run-time type identification) サポート用に
提供されています。演算子の形式は、次のとおりです。
>>-typeid--(--+-expr------+--)--------------------------------->< '-type-name-'
typeid 演算子は、実行時型情報 (RTTI) の生成を要求します。これは、コンパイラー・オプションによっ てコンパイル時に明示的に指定する必要があります。
typeid 演算子は、式 expr の型を表す型 const std::type_info の左辺値を戻します。 typeid 演算子を使用するためには、標準テンプレート・ライブラリー・ヘッダー <typeinfo> をインクルードしておく必要があります。
expr が、ポリモアフィック・クラスへの参照または間接参照ポインターである場合、typeid は、実行時に参照またはポインターが示すオブジェクトを表す type_info オブジェクトを戻します。 ポリモアフィック・クラスでない場合、typeid は、参照の型または間接参照ポインターを表す type_info オブジェクトを戻します。 次の例は、このことを示しています。
#include <iostream> #include <typeinfo> using namespace std; struct A { virtual ~A() { } }; struct B : A { }; struct C { }; struct D : C { }; int main() { B bobj; A* ap = &bobj; A& ar = bobj; cout << "ap: " << typeid(*ap).name() << endl; cout << "ar: " << typeid(ar).name() << endl; D dobj; C* cp = &dobj; C& cr = dobj; cout << "cp: " << typeid(*cp).name() << endl; cout << "cr: " << typeid(cr).name() << endl; }
次に、上記の例の出力を示します。
ap: B ar: B cp: C cr: C
クラス A と B はポリモアフィックで、 クラス C と D はそうではありません。 cp と cr は、型 D のオブジェクトを参照していますが、typeid(*cp) と typeid(cr) は、クラス C を表すオブジェクトを戻します。
左辺値から右辺値へ、配列からポインターへ、および関数からポインターへの変換は、expr へは適用されません。 例えば、次の例の出力は int [10] であって、int * ではありません。
#include <iostream> #include <typeinfo> using namespace std; int main() { int myArray[10]; cout << typeid(myArray).name() << endl; }expr がクラス型であれば、そのクラスは、完全に定義される必要があります。
typeid 演算子は、トップレベルの const または volatile 修飾子を無視します。
関連参照