typeid(T).name() 转T
时间: 2023-10-29 17:04:25 浏览: 150
在 C++ 中,`typeid(T).name()` 返回的是类型 `T` 的名称,是一个字符串。但是,这个字符串的格式是由编译器自行决定的,不同的编译器可能有不同的实现,因此不能依赖这个字符串来进行类型转换。如果需要进行类型转换,可以使用 `dynamic_cast` 或 `static_cast`。
`dynamic_cast` 可以将指向父类的指针或引用转换为指向子类的指针或引用,或者将指向虚基类的指针或引用转换为指向最终派生类的指针或引用。如果转换失败,则返回 `nullptr`。`dynamic_cast` 只能用于含有虚函数的类,因为它需要在运行时动态地检查类型信息。以下是一个示例代码:
```c++
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
void func() {}
};
int main() {
Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);
if (derived) {
derived->func();
}
delete base;
return 0;
}
```
在这个例子中,`Base` 是一个基类,`Derived` 是它的派生类。我们创建了一个 `Derived` 对象,并使用一个 `Base` 类型的指针指向它。然后,我们使用 `dynamic_cast` 将 `base` 指针转换为 `Derived` 指针,并调用 `func` 函数。由于 `dynamic_cast` 转换成功,所以可以安全地调用 `func` 函数。
`static_cast` 可以将一种类型的值转换为另一种类型的值,但是这种转换是在编译时进行的,不会检查类型信息。因此,如果类型转换不安全,就可能会导致运行时错误。以下是一个示例代码:
```c++
int main() {
int a = 10;
double b = static_cast<double>(a);
std::cout << b << std::endl;
return 0;
}
```
在这个例子中,我们使用 `static_cast` 将一个 `int` 类型的值转换为 `double` 类型的值,并将结果保存在 `b` 中。由于这种转换是安全的,因为 `int` 可以转换为 `double`,所以程序可以正常运行。
阅读全文