📅  最后修改于: 2023-12-03 15:38:13.906000             🧑  作者: Mango
在 C++ 中,我们可以使用 typeinfo 来获取对象的类型信息,这在许多情况下都非常有用。本文将介绍在 C++ 中如何使用 typeinfo,包括如何获取对象的类型名称和判断对象是否为某个类型。
要获取一个对象的类型名称,我们可以使用 typeinfo 的 name() 方法。其用法如下:
#include <iostream>
#include <typeinfo>
int main()
{
int i = 42;
std::cout << typeid(i).name() << std::endl;
return 0;
}
输出:
i
需要注意的是,这里的输出实际上是编译器内部使用的类型名称,不同的编译器可能会有不同的实现。如果需要输出更加可读的类型名称,可以使用开源库 Demangle 进行转换。
在 C++ 中,我们可以使用 typeid 运算符和 dynamic_cast 运算符来判断一个对象是否为某个类型。
typeid 运算符的用法如下:
#include <iostream>
#include <typeinfo>
class Base {};
class Derived : public Base {};
int main()
{
Base* base_ptr = new Derived;
if (typeid(*base_ptr) == typeid(Derived)) {
std::cout << "base_ptr points to Derived\n";
} else {
std::cout << "base_ptr points to Base\n";
}
return 0;
}
输出:
base_ptr points to Derived
在这个例子中,我们通过判断 base_ptr 所指对象的类型是否为 Derived,来确定 base_ptr 实际上是否指向了一个 Derived 对象。
dynamic_cast 运算符则可以用来进行更复杂的类型判断。其用法如下:
#include <iostream>
class Base { virtual void foo() {} };
class Derived : public Base {};
int main()
{
Base* base_ptr = new Derived;
if (Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr)) {
std::cout << "base_ptr points to Derived\n";
} else {
std::cout << "base_ptr points to Base\n";
}
return 0;
}
输出:
base_ptr points to Derived
在这个例子中,我们通过将 base_ptr 转换为 Derived* 类型,并判断是否成功,来确定 base_ptr 实际上是否指向了一个 Derived 对象。如果转换成功,我们就可以使用 derived_ptr 指针来访问 Derived 对象的成员了。
在 C++ 中,typeinfo 提供了一种方便获取对象类型信息的方法,我们可以使用 name() 方法来获取类型名称,也可以使用 typeid 和 dynamic_cast 运算符来判断对象是否为某个类型。需要注意的是,不同的编译器实现可能会有所不同。