C++/標準ライブラリ/typeinfo
表示
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の使用時にスローされます。これらの機能を適切に利用することで、実行時の型情報に基づいた処理が可能になります。