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;
}
xxxxxxxxxx
#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