• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class
    <typeinfo>

    std::type_info

    namespace std {
      class type_info;
    }
    

    概要

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

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

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

    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
    

    参照