我正在处理一种特殊情况,在这种情况下,我不能直接使用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);
}发布于 2016-02-03 13:14:12
这将取决于指针是如何开始成为void*的。如果它是从与被转换为(这里的void* )相同的类型转换到MyClass*的,那么是的,这个转换是很好的,并且按预期工作;
来自static_cast
指向
void的类型指针(可能是cv限定的)的prvalue可以转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则结果指针值不变,否则未指定。将任何指针转换为指针到void并返回到指向原始(或更多cv限定)类型的指针将保留其原始值。
以这种方式使用static_cast,本质上就是对编译器说“我知道它是这种类型--请相信我”,而编译器很乐意这样做。
然后可以在此之后对dynamic_cast进行评估。它通常用于转换为更派生的类型。在这里,您正在转换为相同的类型-它并没有做任何特别有用的事情。如果该类型是一个更派生的类型(例如MySpecialisedClass),那么就可以了。
就目前情况而言,该功能可简化为:
MyClass* CastVoidPtr(void* pVoidPtr)
{
return static_cast<MyClass*>(pVoidPtr);
}或者简单地使用裸露的static_cast<>。
值得注意的是,为了完整性起见,这里值得一提的是 has similar functionality;
指向
T1类型对象的任何指针都可以转换为指向另一类型cv T2的对象的指针。这完全等同于static_cast<cv T2*>(static_cast<cv void*>(expression))(这意味着,如果T2的对齐要求不比T1的更严格,指针的值不会改变,并且将结果指针转换回其原始类型将产生原始值)。
https://stackoverflow.com/questions/35177969
复制相似问题