type_infoクラス
type_infoクラスは、型情報を格納する型であり、<typeinfo>ヘッダによって提供されます。
typeid演算子によってのみ生成される type_infoオブジェクトには、型名文字列へのポインター その他の型情報が格納されています。
( typeid演算子が生成するのは、const std::type_info型の左辺値です。typeid演算子の結果は、その参照になります。)
typeid演算子に型 あるいは オブジェクトを渡すことにより生成される type_infoオブジェクトは、その型 あるいは オブジェクト の実行時型情報 RTTI です。
type_infoクラスの定義は、概略としては、以下のようになっています。
class type_info {
public:
virtual ~type_info();
bool operator== (const type_info&) const;
bool operator!= (const type_info&) const;
const char* name() const;
・・・
その他
・・・
type_info(const type_info&);
type_info& operator= (const type_info&);
};
・ メンバ関数 name は、処理系定義の NTBS を返却します。
( NTBS … Null-Terminated Byte String のことで、末尾がナル文字になっている C言語形式の文字列です。)
・ type_info コピー コンストラクターは private であるため、type_infoクラスのオブジェクトを直接インスタンス化することはできません( ★1. )。
( type_info オブジェクトの生成は、typeid 演算子によってのみ可能です。)
・ 代入演算子「 = 」も private です。したがって、type_infoオブジェクトのコピーや代入を行うことはできません( ★2. )。
// ------------------------------------
#include <typeinfo>
#include <iostream>
int main() {
std::cout << typeid(int).name() << '\n';
// const type_info obj1 = typeid(int); // エラー ★1.
const type_info& ref1 = typeid(double);
std::cout << ref1.name() << '\n';
const type_info& ref2 = typeid(unsigned);
std::cout << ref2.name() << '\n';
const type_info* ptr = &typeid(double);
std::cout << ptr->name() << "\n\n";
// ref1 = ref2; // エラー ★2.
std::cout << std::boolalpha
<< (typeid(int) == typeid(5)) << '\n';
// operator==
std::cout << (typeid(int) != typeid(5)) << '\n';
// operator!=
}
// ------------------------------------