📜  typeid 到字符串 c++ (1)

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

C++中的typeid类型识别器

在 C++ 中,typeid 是一种用于获取表达式的运行时类型信息的运算符。它可以用来获取一个对象、指针、引用等的类型信息,并返回一个 type_info 类型的对象,该对象包含有关该类型的信息。

用法

使用typeid时,需要将表达式作为操作数,语法如下:

typeid(expression);

该操作符返回一个std::type_info类型的对象,其用法可以包括下列操作:

// 获取对象/类型/变量的名称
const char* name = typeid(expression).name();

// 比较类型是否相等
bool isEqual = typeid(expression1) == typeid(expression2);

// 判断对象是否是某种类型之一
bool isDerived = dynamic_cast<DerivedClass*>(obj) != nullptr;
示例

下面是一些关于 typeid 的示例:

#include <iostream>
#include <typeinfo>

int main() {
  int i = 5;
  std::cout << "Type of i is " << typeid(i).name() << std::endl;

  const char* str = "Hello, World!";
  std::cout << "Type of str is " << typeid(str).name() << std::endl;

  if (typeid(i) == typeid(int)) {
    std::cout << "i is an integer" << std::endl;
  }

  class Base {
  public:
    virtual void print() {}
  };

  class Derived : public Base {};

  Base* baseObj = new Derived();
  if (typeid(*baseObj) == typeid(Derived)) {
    std::cout << "baseObj is a Derived object" << std::endl;
  }

  return 0;
}

上面的代码输出如下:

Type of i is int
Type of str is char const *
i is an integer
baseObj is a Derived object
注意事项
  • typeid 返回的类型和实际类型名字之间可能没有直接的联系。(编译器可能会进行优化来简化类型信息,以减小可执行文件的大小)
  • 某些编译器可能不支持对基本类型使用 typeid
  • 对于基本类型的指针或引用类型,typeid 返回的不是指针或引用类型的信息本身,而是指向基本类型的指针类型的信息。
  • typeid 返回的类型信息会在运行时动态生成,因此通常会比使用其他方式获取类型信息要慢一些。
  • 类型信息可以用来动态地决定程序的流程,比如根据一个对象的实际类型来执行相应的操作。
总结

typeid 运算符是 C++ 中一种能够提供关于运行时类型信息的很有用的技巧。通过 typeid,我们可以获取一个对象、指针或引用等的类型信息,并动态地根据这些信息来执行相应的操作。虽然 typeid 能够提供有关类型的有效信息,但仍然需要谨慎使用,因为它可能并不总是返回所期望的结果。