接口限制迫使我使用static_cast將MyObject*
轉換爲void*
。當這個指針回到以後的接口調用時,我必須執行另一個static_cast從void*
到MyObject*
,因爲在這種情況下dynamic_cast不起作用(解釋爲here)。任何方式執行static_cast之後的類型安全檢查?
但是,我想執行一個類型安全檢查,以確保沒有奇怪的事情發生,如果其他人更改了部分代碼。如果在這種情況下可以進行任何檢查,哪一個檢查最好/最方便?
接口限制迫使我使用static_cast將MyObject*
轉換爲void*
。當這個指針回到以後的接口調用時,我必須執行另一個static_cast從void*
到MyObject*
,因爲在這種情況下dynamic_cast不起作用(解釋爲here)。任何方式執行static_cast之後的類型安全檢查?
但是,我想執行一個類型安全檢查,以確保沒有奇怪的事情發生,如果其他人更改了部分代碼。如果在這種情況下可以進行任何檢查,哪一個檢查最好/最方便?
不,一旦你點擊了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()
刪除過期指針和鑄造前檢查集創建。
不,您不必使用'static_cast'將'MyObject *'轉換爲'void *'。這是一個隱含的轉換。是的,你必須使用'static_cast'從'void *'返回到'MyObject *'。 –
顯示回調提交和回調函數之間關聯的代碼註釋通常足以提醒維護人員更新類型信息。如果人們在代碼中出現錯誤,請編寫腳本在構建期間運行以驗證匹配類型。 –
您還可以使用類型系統來幫助保證這一點,方法是爲每個回調創建一個typedef並在兩側使用它。假設你有一個'async_lookup'函數,你可以聲明'typedef DictionaryEntry async_lookup_cb_type' –