C++11 で変数の型情報を実行時に取得する - C++ プログラミング
PROGRAM
C++11 で変数の型情報を実行時に取得する
C++11 では、変数の型情報を取得するキーワード typeid が規定されています。
これを使用することで、実行時に変数の型情報を表示したり、型に応じて処理条件を変えたりできます。
型情報を取得する
たとえば、変数 data の型情報は、次のように取得できます。
const std::type_info& info = typeid(data);
このように typeid キーワードの引数として変数を指定することで、その変数に関する情報を std::type_info クラスを参照型で取得できます。
ここで取得した type_info クラスでは、name 関数を使って型の情報を文字列で取得することができます。
const char* typeName = info.name();
また、hash_code 関数を使えば型毎に一意の値を size_t 型の数値も得られます。
size_t typeHash = info.hash_code();
クラスの情報を取得する場合は、派生クラスなどの都合で少し注意したいところがあります。
クラスであっても結論としてはそれが示す情報を正しく取得することができるのですけど、判りにくいのが、クラス COurClass が CMyClass から派生していて、そのポインタを CMyClass* で管理している場合です。
CMyClass* classes[2];
classes[0] = new CMyClass();
classes[1] = new COurClass();
このとき classes[1] には COurClass インスタンスへのポインタが格納されていますが、次のようにして型の情報を取得すると、実際のインスタンスとは関係なく、ポインタを格納している変数の型である "CMyClass*" の情報が取得されます。
const std::type_info& info = typeid(classes[1]);
気にしているのがインスタンスの型なのであれば、次のようにして情報を取得しないといけません。
const std::type_info& info = typeid(*classes[1]);
このようにすることで、格納されているインスタンスの型 "COurClass" の情報を取得できます。
型情報を比較する
この std::type_info の値を使って、2 つの型情報が同じ型であるかどうかを判定することもできます。
const std::type_info& infoA = typeid(a);
const std::type_info& infoB = typeid(b);
if (infoA == infoB)
{
}
このように std::type_info 同士を比較することで、それらが同じ型を表しているかを判定できます。
このとき、クラス型の型情報どうしの比較では、型が完全に一致するかで判断されて、継承関係までは考慮されないことに注意します。
たとえば、派生クラス COurClass が CMyClass から派生しているときに、COurClass 型の変数の typeid と CMyClass 型の変数の typeid とを取ってそれらを比較しても false になります。
あくまでも COurClass 型の変数同士の typeid を比較したときに true になります。
そのため、継承関係を含めて比較したい場合には、C++ で型のキャストを使う で紹介した dynamic_cast<T> を使ってキャストに成功したかで判断することになりそうです。
[ もどる ]