运行时类型检测(run-time type identification, RTTI)
关键字 typeid 返回表达式的类型
使用前应引用
typeid(表达式\类型名)
-
返回一个常量对象的引用,该对象的类型为标准库类型type_info或type_info的共有派生类。
-
顶层const将被忽略
-
作用于数组或函数时,不会执行指针的标准类型转换(即指针与数组区别对待,指针是指针类型,数组是数组类型。)
-
当作用于某种类型的指针或引用时,如果该类型含有虚函数,运算符将使用指针或引用所绑定对象的动态类型。
-
typeid作用于指针时(而非指针所指向的对象),返回的结果是该指针的静态编译时类型!!
-
type_info 对象操作
- == 相等判断
- !=
- name() 打印类型名(依赖编译器实现)
- t1.before(t2) 返回bool,t1是否在t2之前(依赖编译器)
-
name()
int t_int;
long long t_long_long;
long t_long;
float t_float;
double t_double;
char t_char;
cout<<typeid(t_int).name()<<endl;
cout<<typeid(t_long_long).name()<<endl;
cout<<typeid(t_long).name()<<endl;
cout<<typeid(t_float).name()<<endl;
cout<<typeid(t_double).name()<<endl;
cout<<typeid(t_char).name()<<endl;
cout<<"--------------"<<endl;
int *a;
int b[10][13];
int *c[10];
int *(*d)[10];
int (*(*e[100])(char,int, float))[10];
int (*(*(*f)(int *))[5])(int *);
int (*(*g[7][8][9])(int*))[5];
cout<<typeid(a).name()<<endl;
cout<<typeid(b).name()<<endl;
cout<<typeid(c).name()<<endl;
cout<<typeid(d).name()<<endl;
cout<<typeid(e).name()<<endl;
cout<<typeid(f).name()<<endl;
cout<<typeid(g).name()<<endl;
输出
i
x
l
f
d
c
Pi
A10_A13_i
A10_Pi
PA10_Pi
A100_PFPA10_icifE
PFPA5_PFiPiES_E
A7_A8_A9_PFPA5_iPiE
可见
P_type 表 type *p;
Anum 表 A[num]
F+返回值类型+参数类型1+参数类型2+...+参数类型n+E 表示 函数