📜  如何在 C++ 中找到 typein(1)

📅  最后修改于: 2023-12-03 15:38:13.906000             🧑  作者: Mango

如何在 C++ 中找到 typeinfo

在 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 运算符来判断对象是否为某个类型。需要注意的是,不同的编译器实现可能会有所不同。