2016-02-03 60 views
0

我處理,我不能直接使用dynamic_cast因爲對象是void*一個特例。使用它第一static_cast然後dynamic_cast(在static_cast的結果)是不好的做法?這是錯的嗎?使用的static_cast然後dynamic_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); 
} 
+3

'pTemp'已經是'MyClass *',你期望'dynamic_cast'在這裏做什麼?你的評論沒有意義 - 如果'pVoidPtr'是一個nullptr,那麼'pTemp'也是,所以你仍然可以返回它。 – Barry

+0

如果'pVoidPtr'不是'MyClass'類型,'pTemp'不會是非null? –

+0

原創評論:只是爲了提高@巴里的評論:'回報的dynamic_cast (pVoidPtr);'應該做的工作。查看答案以獲取更多詳細信息。編輯評論:哦,我不知道這是不可能的。忘記我的評論。 –

回答

3

這將取決於指針是怎麼成爲一個void*開始。如果它是從同類型強制轉換爲void*作爲強制轉換(這裏MyClass*),然後是,這個轉換是罰款和按預期工作;

cppreference on static_cast

類型的指針甲prvalue到void(可能CV修飾)可被轉換爲指針的任何類型。如果原始指針的值滿足目標類型的對齊要求,則結果指針值不變,否則不指定。將任何指針轉換爲指向void的指針,並返回指向原始(或更多cv-qualified)類型的指針,以保留其原始值。

以這種方式使用static_cast本質上是說編譯器「我知道這是這種類型 - 相信我」,並且編譯器有責任。

dynamic_cast然後可以在此之後進行評估。它通常用於轉換爲更多派生類型。在這裏,你正在鑄造相同的類型 - 它沒有做任何特別有用的事情。如果這個類型是一個更派生類型(例如MySpecialisedClass),那麼它會很好。


目前的情況是,該功能可以簡化爲:

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

或者簡單地用一個裸體static_cast<>


附註;這裏值得一提的是完整性是reinterpret_cast has similar functionality;

任何指針T1類型的到對象可被轉換爲指針的另一類型的cv T2到對象。這是完全等效於static_cast<cv T2*>(static_cast<cv void*>(expression))(這意味着如果T2的對準要求不嚴格大於T1的,指針的值不改變,並且所產生的指針轉換回其原始類型產生的原始值)。在任何情況下,只有在類型別名規則允許的情況下,才能安全地解除引用的指針...