ここでは、実行時型識別と言う機能をご紹介します。
非常に難しく感じるかと思いますが、
そんなに難しい事をしているワケではありません。
実行時型識別は、その名の通り、
プログラム実行中に変数のデータ型を知りたい場合や
あるポインタ値が何のデータ型ポインタなのかを知りたい場合に使い、
この機能を使って得たデータ型情報を使って
動的にプログラムを組む事ができます。
実行時型識別はアルファベット4文字でRTTIと表現される事もあります。
これは ラン タイム タイプ アイデンティフィケーション の略です。
Run Time Type Identification
実行時型識別機能にはいくつか種類がありますが、
ここでは、typeid演算子を使った方法を説明します。
typeid演算子は関数のように使い、
引数には、変数名、データ型名、クラス名、インスタンス名等を指定します。
結果として渡した引数に関する型情報が返ります。
この型情報を活用するには、
typeid演算子の結果同士を比較する必要があります。
使用例
#include <iostream>
#include <typeinfo>
using namespace std;
class myclass {
};
void main() {
char cdata1, cdata2, *cp = &cdata1;
myclass obj;
// cdata1の型がchar型かどうか比較する
if ( (typeid(cdata1) == typeid(char)) ) {
cout << "cdata1はchar型です" << '\n';
} else {
cout << "cdata1はchar型ではありません" << '\n';
}
// cdata1の型とcdata2の型が同じ型かどうか比較する
if ( (typeid(cdata1) == typeid(cdata2)) ) {
cout << "cdata1とcdata2は同じ型です" << '\n';
} else {
cout << "cdata1とcdata2は同じ型ではありません" << '\n';
}
// *cpの型とcharの型が同じ型かどうか比較する
if ( (typeid(*cp) == typeid(char)) ) {
cout << "*cpとcharは同じ型です" << '\n';
} else {
cout << "*cpとcharは同じ型ではありません" << '\n';
}
// objの型がmyclass型かどうか比較する
if ( (typeid(obj) == typeid(myclass)) ) {
cout << "objはmyclass型です" << '\n';
} else {
cout << "objはmyclass型ではありません" << '\n';
}
まずはじめに、typeid演算子を使うには、
#include <typeinfo>と言う記述が必要です。
動作結果は以下のようになります。