2017-01-30 26 views
0

接口限制迫使我使用static_cast將MyObject*轉換爲void*。當這個指針回到以後的接口調用時,我必須執行另一個static_cast從void*MyObject*,因爲在這種情況下dynamic_cast不起作用(解釋爲here)。任何方式執行static_cast之後的類型安全檢查?

但是,我想執行一個類型安全檢查,以確保沒有奇怪的事情發生,如果其他人更改了部分代碼。如果在這種情況下可以進行任何檢查,哪一個檢查最好/最方便?

+0

不,您不必使用'static_cast'將'MyObject *'轉換爲'void *'。這是一個隱含的轉換。是的,你必須使用'static_cast'從'void *'返回到'MyObject *'。 –

+0

顯示回調提交和回調函數之間關聯的代碼註釋通常足以提醒維護人員更新類型信息。如果人們在代碼中出現錯誤,請編寫腳本在構建期間運行以驗證匹配類型。 –

+0

您還可以使用類型系統來幫助保證這一點,方法是爲每個回調創建一個typedef並在兩側使用它。假設你有一個'async_lookup'函數,你可以聲明'typedef DictionaryEntry async_lookup_cb_type' –

回答

1

不,一旦你點擊了void*這完全取決於代碼是否正確。根本原因在於你理論上回歸的void*幾乎可以指向任何東西:a char,int,std::string,std::complex<double>, std::map<int, int>::iterator並且當然還有MyObject

您將面對的問題是,只有當void*實際指向MyObject時,您的演員陣容纔會有效,但在這種情況下演員陣容並非必要。

非鑄造的解決方法是保持一個std::unordered_set<void*>所有void*您鑄造MyObject*,通過~MyObject()刪除過期指針和鑄造前檢查集創建。

+0

你對此很清楚,但是在static_cast從'void *'到'MyObject *'之後沒有任何方法可以執行類型檢查嗎?在一般情況下,這意味着我需要檢查一個對象是否真的具有它所具有的類型。 – Migsi

+0

@Migsi:不可以。有三種情況需要考慮:檢查通過,檢查失敗,未定義行爲。嘗試一個'static_cast '只能導致一個檢查通過或UB,並且一旦你擊中了UB,你就無法撤消它。所以「檢查失敗」的結果是不可能的。 – MSalters

相關問題