C++教科書/標準ライブラリ編/<typeinfo>の章
編集はじめに
編集C++プログラムでは、実行時に様々な型の情報を必要とする場面があります。たとえば、例外処理や動的キャストなどでは、オブジェクトの実際の型を知る必要があります。<typeinfo>
ヘッダーはこのような目的で使用され、型情報を扱うクラスやユーティリティを提供しています。
std::type_info
編集概要
編集std::type_info
クラスは、実行時の型情報を扱うためのクラスです。typeid
キーワードを使うと、このクラスのオブジェクトが返されます。
メンバー関数
編集- bool operator==(const type_info& rhs) const noexcept;
- 2つのtype_infoオブジェクトが同じ型を表しているかを比較します。
- bool before(const type_info& rhs) const noexcept;
- 型名の非形式的な順序付けに基づいて、thisがrhsより前か後かを判定します。
- size_t hash_code() const noexcept;
- 型のハッシュ値を返します。
- const char* name() const noexcept;
- 型の名前を示す文字列を返します。実装依存の表記となります。
特殊メンバー関数の制約
編集type_info
クラスはコピーコンストラクタと代入演算子がdeleteされているため、コピーは許可されません。
bad_cast例外クラス
編集bad_cast
クラスは、dynamic_cast
で適切でないキャストが行われた際にスローされる例外クラスです。例えば、ポリモーフィック型の参照に対する不適切なキャストでスローされます。
コンストラクタ
編集特に明示されたコンストラクタはありません。
what()メンバー関数
編集- const char* what() const noexcept override;
- 適切なエラーメッセージを返します。
bad_typeid例外クラス
編集bad_typeid
クラスは、nullptr
に対してtypeid
が使用された場合にスローされる例外クラスです。
コンストラクタ
編集特に明示されたコンストラクタはありません。
what()メンバー関数
編集- const char* what() const noexcept override;
- 適切なエラーメッセージを返します。
使用例
編集type_infoの比較
編集int* a = new int; double* b = new double; const std::type_info& aType = typeid(*a); const std::type_info& bType = typeid(*b); if (aType == bType) { std::cout << "Same type" << std::endl; } else { std::cout << "Different types" << std::endl; // この出力 }
型情報の取得
編集std::string obj("Example String"); const std::type_info& typeInfo = typeid(obj); std::cout << "Type name: " << typeInfo.name() << std::endl; // Type name: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
bad_cast例外の捕捉
編集class Base { virtual void func() {} }; class Derived : public Base {}; Base* b = new Derived(); try { Derived* d = dynamic_cast<Derived*>(b); // OK } catch (std::bad_cast& e) { std::cerr << e.what() << std::endl; }
bad_typeid例外の捕捉
編集int* p = nullptr; try { typeid(*p); // nullptrに対してtypeidを使用 } catch(std::bad_typeid& e) { std::cerr << e.what() << std::endl; // std::bad_typeid例外がスロー }
まとめ
編集<typeinfo>
ヘッダーは、実行時の型情報を取得したり、型の比較を行うための機能を提供します。type_info
クラスでは型名の取得や型の同一性の比較ができ、bad_cast、bad_typeidの2つの例外クラスはそれぞれ動的キャストの失敗時や、nullptrに対するtypeidの使用時にスローされます。これらの機能を適切に利用することで、実行時の型情報に基づいた処理が可能になります。