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