获取变量类型(type_info)
在C++template编程的时候,可能需要对数据类型T进行变量类型判断,可以使用type_info配合typeid直接获得。
typeid会把类型信息保存到type_info对象里面,当需要具体信息时,可以通过成员函数直接提取。
1 class Base{ }; 2 struct STU{ }; 3 int main(){ 4 //获取一个普通变量的类型信息 5 int n = 100; 6 const type_info &nInfo = typeid(n); 7 cout<<nInfo.name()<<" | "<<nInfo.raw_name()<<" | "<<nInfo.hash_code()<<endl; 8 //获取一个字面量的类型信息 9 const type_info &dInfo = typeid(25.65); 10 cout<<dInfo.name()<<" | "<<dInfo.raw_name()<<" | "<<dInfo.hash_code()<<endl; 11 //获取一个对象的类型信息 12 Base obj; 13 const type_info &objInfo = typeid(obj); 14 cout<<objInfo.name()<<" | "<<objInfo.raw_name()<<" | "<<objInfo.hash_code()<<endl; 15 //获取一个对象的类型信息 16 Base *be = new Base; 17 const type_info &beInfo = typeid(*be); 18 cout<<beInfo.name()<<" | "<<beInfo.raw_name()<<" | "<<beInfo.hash_code()<<endl; 19 //获取一个对象的指针 20 const type_info &bepInfo = typeid(be); 21 cout<<bepInfo.name()<<" | "<<bepInfo.raw_name()<<" | "<<bepInfo.hash_code()<<endl; 22 //获取一个类的类型信息 23 const type_info &baseInfo = typeid(Base); 24 cout<<baseInfo.name()<<" | "<<baseInfo.raw_name()<<" | "<<baseInfo.hash_code()<<endl; 25 //获取一个结构体的类型信息 26 const type_info &stuInfo = typeid(struct STU); 27 cout<<stuInfo.name()<<" | "<<stuInfo.raw_name()<<" | "<<stuInfo.hash_code()<<endl; 28 //获取一个普通类型的类型信息 29 const type_info &charInfo = typeid(char); 30 cout<<charInfo.name()<<" | "<<charInfo.raw_name()<<" | "<<charInfo.hash_code()<<endl; 31 //获取一个表达式的类型信息 32 const type_info &expInfo = typeid(20 * 45 / 4.5); 33 cout<<expInfo.name()<<" | "<<expInfo.raw_name()<<" | "<<expInfo.hash_code()<<endl; 34 35 return 0; 36 }
其中
- name():变量类型名称
- raw_name():名字编码(Name Mangling),和name()区别在于,name()是raw_name()解码后的值,方便用户查看
- hash_name():当前类型对应的 hash 值
- typeid(be)和typeid(*be)是不一样的,一个是对象指针,一个是对象
扩展:
1) 原型:const char* name() const;
返回一个能表示类型名称的字符串。但是C++标准并没有规定这个字符串是什么形式的,例如对于上面的objInfo.name()
语句,VC/VS 下返回“class Base”,但 GCC 下返回“4Base”。
2) 原型:bool before (const type_info& rhs) const;
判断一个类型是否位于另一个类型的前面,rhs 参数是一个 type_info 对象的引用。但是C++标准并没有规定类型的排列顺序,不同的编译器有不同的排列规则,程序员也可以自定义。要特别注意的是,这个排列顺序和继承顺序没有关系,基类并不一定位于派生类的前面。
3) 原型:bool operator== (const type_info& rhs) const;
重载运算符“==”,判断两个类型是否相同,rhs 参数是一个 type_info 对象的引用。
4) 原型:bool operator!= (const type_info& rhs) const;
重载运算符“!=”,判断两个类型是否不同,rhs 参数是一个 type_info 对象的引用。