C++中的typeInfo用法总结
最近在做测试,在大型程序中,模板类型加上继承关系搞得我混乱,还好有tpyeinfo帮助捋顺关系。
typeInfo与typeid简单总结说明:
和sizeof这类的操作符一样,typeid是C++的关键字之一。
typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)
C++并没有规定typeid实现标准,各个编译器可能会不一样。
编译器会为每一种typeid操作的类型生成一份保存在数据段的type_info数据。
每种类型的type_info数据长度依赖于类型名称,至少9个字节。
1. == 和!=操作
判断两个数据类型是否相同,判定的数据可以是自己定义的数据类型。
代码示例:
#include <iostream> // std::cout
#include <typeinfo> // operator typeid
struct Base {};
struct Derived : Base {};
struct Poly_Base {virtual void Member(){}};
struct Poly_Derived: Poly_Base {};
typedef int my_int_type;
int main() {
std::cout << std::boolalpha;
// fundamental types:
std::cout << "int vs my_int_type: ";
std::cout << ( typeid(int) == typeid(my_int_type) ) << '\n';
// class types:
std::cout << "Base vs Derived: ";
std::cout << ( typeid(Base)==typeid(Derived) ) << '\n';
// non-polymorphic object:
Base* pbase = new Derived;
std::cout << "Base vs *pbase: ";
std::cout << ( typeid(Base)==typeid(*pbase) ) << '\n';
// polymorphic object:
Poly_Base* ppolybase = new Poly_Derived;
std::cout << "Poly_Base vs *ppolybase: ";
std::cout << ( typeid(Poly_Base)==typeid(*ppolybase) ) << '\n';
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
输出:
int vs my_int_type: true
Base vs Derived: false
Base vs *pbase: true
Poly_Base vs *ppolybase: false
1
2
3
4
2. name操作
获取数据类型的名字,这个名字是C风格的字符串指针。
##include <iostream> // std::cout
#include <typeinfo> // operator typeid
struct Base {};
struct Derived : Base {};
template<class T>
void swap(T a, T b)
{
std::cout << "T is: " << typeid(T).name() << '\n';
T temp = a;
a = b;
b = temp;
}
int main() {
int i;
int * ptr;
std::cout << "int is: " << typeid(int).name() << '\n';
std::cout << " i is: " << typeid(i).name() << '\n';
std::cout << " pi is: " << typeid(ptr).name() << '\n';
std::cout << "*pi is: " << typeid(*ptr).name() << '\n';
Base base;
std::cout << "Base is: " << typeid(Base).name() << '\n';
std::cout << "base is: " << typeid(base).name() << '\n';
std::cout << "Derived is: " << typeid(Derived).name() << '\n';
swap(1,2);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
输出:
int is: i
i is: i
pi is: Pi
*pi is: i
Base is: 4Base
base is: 4Base
Derived is: 7Derived
T is: i
————————————————
原文链接:https://blog.csdn.net/QLeelq/article/details/116054654