最終更新日時:
が更新

履歴 編集

class
<typeinfo>

std::type_info

namespace std {
  class type_info;
}

概要

type_infoクラスは、typeid演算子によって返される、型の情報が格納された型である。

ユーザーは、この型を使用して、型名の検索や比較を行うことができる。typeid演算子に型を渡すと、その型のtype_infoオブジェクトが返され、typeid演算子にオブジェクトを渡すと、そのオブジェクトの型のtype_infoオブジェクトが返される。

typeidに、多相的な型のオブジェクトへの間接参照されたポインタに適用される場合、その型は実行時に決定する。これは、RTTI(実行時型情報)が利用可能であることを要求する。

typeid演算子に、間接参照されたヌルポインタが渡された場合、bad_typeid例外が投げられる。

メンバ関数

名前 説明 対応バージョン
(constructor) コンストラクタ
(destructor) デストラクタ
operator=(const type_info&) = delete 代入演算子
before 2つの型の照合順序を比較する
hash_code 型のハッシュ値を取得する C++11
name 実装定義の型名を取得する
operator== 2つの型が同じかを判定する
operator!= 2つの型が異なるかを判定する

#include <iostream>
#include <typeinfo>

struct Base {};
struct Derived : public Base {};

struct PolyBase { virtual void member(){} };
struct PolyDerived : public PolyBase {};

int main() {
  // 組み込み型
  int i;
  int* pi;
  std::cout << "int is: " << typeid(int).name() << std::endl;
  std::cout << "  i is: " << typeid(i).name() << std::endl;
  std::cout << " pi is: " << typeid(pi).name() << std::endl;
  std::cout << "*pi is: " << typeid(*pi).name() << std::endl;
  std::cout << std::endl;

  // 非多相的な型
  Derived derived;
  Base* pbase = &derived;
  std::cout << "derived is: " << typeid(derived).name() << std::endl;
  std::cout << " *pbase is: " << typeid(*pbase).name() << std::endl;
  std::cout << std::boolalpha << "same type? "
            << (typeid(derived) == typeid(*pbase)) << std::endl;
  std::cout << std::endl;

  // 多相的な型
  PolyDerived polyderived;
  PolyBase* ppolybase = &polyderived;
  std::cout << "polyderived is: " << typeid(polyderived).name() << std::endl;
  std::cout << " *ppolybase is: " << typeid(*ppolybase).name() << std::endl;
  std::cout << std::boolalpha << "same type? "
            << (typeid(polyderived) == typeid(*ppolybase)) << std::endl;
}

出力例

int is: int
  i is: int
 pi is: int *
*pi is: int

derived is: struct Derived
 *pbase is: struct Base
same type? false

polyderived is: struct PolyDerived
 *ppolybase is: struct PolyDerived
same type? true

参照