C++ typeidとは?実行時型識別

ここでは、実行時型識別と言う機能をご紹介します。

非常に難しく感じるかと思いますが、
そんなに難しい事をしているワケではありません。

実行時型識別は、その名の通り、
プログラム実行中に変数のデータ型を知りたい場合や
あるポインタ値が何のデータ型ポインタなのかを知りたい場合に使い、

この機能を使って得たデータ型情報を使って
動的にプログラムを組む事ができます。

実行時型識別はアルファベット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>と言う記述が必要です。

動作結果は以下のようになります。