获取变量类型(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 }

 

 

 其中

  1. name():变量类型名称
  2. raw_name():名字编码(Name Mangling),和name()区别在于,name()是raw_name()解码后的值,方便用户查看
  3. hash_name():当前类型对应的 hash 值
  4. 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 对象的引用。

 

转自:http://c.biancheng.net/view/2301.html

posted @ 2021-10-08 11:49  补码  阅读(556)  评论(0编辑  收藏  举报