typeid
読み:タイプ-アイディー
外語:typeid
C++の予約語
の一つ。
オブジェクトの型情報であるtype_info型オブジェクトを得る
演算子
。
目次
文法
概要
特徴
定義
nameメソッド
複雑な場合
文法
#include
<typeinfo>
概要
C++は、動的に型情報を取得する機構として
実行時型情報
(RTTI)というものが用意されている。
RTTIのためにtype_infoクラスが用意されており、
標準C++ライブラリ
のtypeinfoをincludeすることで利用できるようになる。
typeid演算子は、const type_infoの
参照
を戻す。
特徴
定義
type_infoクラスには内部的な機能などもあるが、公開され、広く利用されるものは、オーバーロードされた二つの演算子(==演算子、!=演算子)と、次のメソッドである。
const char *name() const
これは、次のように使う。
std::cout << typeid(i).name() << std::endl;
iの部分は、
変数名
等の他、intなどの変数型を直接書いても良いし、即値でも良い。
nameメソッド
結果はchar *、つまり
ASCIIZ
形式で返される。
内容については完全に処理系依存である。
intを "int" と返す実装もあれば、"i" と記号で返す実装もあり、多様である。
FreeBSDのg++(
GCC
)では、次のような記号を返す。
a signed char
b bool
c char
d double
e long double
f float
h unsigned char
i signed int、int
j unsigned int
l signed long、long
m unsigned long
s signed short、short
t unsigned short
v void
w wchar_t
x signed long long、long long
y unsigned long long
A 文字列(char *形式は "A長さ_c"、wchar_t *形式は "A長さ_w")
C 定数
E 終わり(FやNなどのモードの終端)
F 関数初め
K const
N namespace初め
P ポインター
V volatile
数字 class、struct、enum、unionなど
char *なら "Pc"、const char *なら "PKc" になる。
class
や
struct
は、その名前が返される。例えばclass Hogeに対するポインターは、クラス名が4文字なので、"P4Hoge" となる。
register
、
auto
、
static
などの修飾は結果に現われないが、
const
はK、
volatile
はVが出力されている。
文字列を即値で与える(例えばtypeid("hoge").name()など)と、NUL末端を含めた文字列長と、charかwchar_tかの識別子が出力される。例えば、"A5_c" などとなる。
複雑な場合
関数や
namespace
内のclassなどの場合、複雑な出力になる。
関数は、int hoge()であれば "FivE"、int main(int argc, char**argv)であれば "FiiPPcE" のようになる。
namespaceでは、namespace fuga内のclass hogeなら "N4fuga4hogeE" と出力される。
再検索