C++ 中,<typeinfo> 是标准库的一部分,它提供了运行时类型识别(RTTI,Run-Time Type Identification)功能。RTTI 允许程序在运行时确定对象的类型。这是通过使用 typeid 运算符和 type_info 类实现的。
type_info 类是一个抽象基类,它提供了关于类型信息的接口。每个类型都有一个与之关联的 type_info 对象,可以通过 typeid 运算符访问。
语法
<typeinfo> 相关的主要语法:
typeid 运算符:用于获取对象的类型信息。
type_info 类:包含类型信息的类。
std::type_info 类
std::type_info 是一个抽象基类,用于表示类型的信息。它不能被直接实例化,只能通过 typeid 操作符获取其对象。
std::type_info 提供了以下几个成员函数:
name() const noexcept:返回一个指向以 null 结尾的字符数组的指针,该数组包含描述类型的字符串。这个字符串的格式是未指定的,依赖于实现。
operator== 和 operator!=:比较两个 std::type_info 对象是否表示相同的类型。
typeid 操作符
typeid 操作符用于获取一个对象的类型信息,其语法有两种形式:
typeid(T):其中 T 是一个类型(类或内置类型)。返回该类型的 std::type_info 对象的引用。
typeid(e):其中 e 是一个表达式。返回表达式 e 的静态类型的 std::type_info 对象的引用(如果 e 是多态类型,则返回其动态类型的 std::type_info 对象)。
示例代码
#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() = default; // 确保 Base 是一个多态类型
};
class Derived : public Base {};
int main() {
Base* basePtr = new Derived();
// 使用 typeid 获取静态类型信息
std::cout << "Static type of basePtr: " << typeid(*basePtr).name() << std::endl;
// 使用 typeid 获取动态类型信息(需要多态类型)
std::cout << "Dynamic type of basePtr: " << typeid(basePtr).name() << std::endl;
std::cout << "Dynamic type of object pointed by basePtr: " << typeid(*basePtr).name() << std::endl;
// 比较类型信息
if (typeid(*basePtr) == typeid(Derived)) {
std::cout << "basePtr points to an object of type Derived" << std::endl;
} else {
std::cout << "basePtr does not point to an object of type Derived" << std::endl;
}
delete basePtr;
return 0;
}