Using static_cast and then dynamic_cast

Using static_cast and then dynamic_cast

本文关键字:cast dynamic then and Using static      更新时间:2023-10-16

我正在处理一种特殊情况,我不能直接使用dynamic_cast,因为对象是void*。先使用static_cast,然后再dynamic_cast(根据static_cast的结果(是不好的做法吗?有错吗?

以下是我所说的一个例子:

MyClass* CastVoidPtr(void* pVoidPtr)
{
    // casting it to MyClass so we could use dynamic_cast
    MyClass* pTemp = static_cast<MyClass*>(pVoidPtr);
    // returning the actual result that will make sure that we have a MyClass object or a nullptr
    return dynamic_cast<MyClass*>(pTemp);
}

这取决于指针如何开始成为void*。如果它从与投射到(此处MyClass*相同的类型转换为void*,那么是的,此强制转换很好并且按预期工作;

从 cpp 首选项上static_cast

指向void的指针类型的 prvalue(可能符合 cv 条件(可以转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则生成的指针值保持不变,否则未指定。将任何指针转换为指向void的指针,然后再转换回指向原始(或更符合 cv 条件(类型的指针,将保留其原始值。

以这种方式使用static_cast本质上是对编译器说"我知道它是这种类型 - 相信我",编译器有义务。

然后可以在此之后评估dynamic_cast。它通常用于强制转换为派生程度更高的类型。在这里,您正在转换为相同的类型 - 它没有做任何特别有用的事情。如果类型是派生类型(例如 MySpecialisedClass(,那就没问题了。


就目前而言,该功能可以简化为:

MyClass* CastVoidPtr(void* pVoidPtr)
{
    return static_cast<MyClass*>(pVoidPtr);
}

或者简单地使用裸static_cast<>.


旁注; 为了完整性,这里值得一提的是reinterpret_cast具有类似的功能;

任何指向 T1 类型的对象的指针都可以转换为指向另一种类型对象的指针 cv T2 。这完全等同于 static_cast<cv T2*>(static_cast<cv void*>(expression))(这意味着如果T2的对齐要求不比 T1 的对齐要求更严格,则指针的值不会更改,并且将生成的指针转换回其原始类型会产生原始值(。在任何情况下,只有在类型别名规则允许的情况下,才能安全地取消引用生成的指针...