將boost::function 降級為普通函數指標
處理boost::function 時面臨的常見挑戰之一是需要將其轉換為普通函數指標。當與期望具有特定簽章的函數指標的程式碼互動時,會出現這種情況,而可用函數封裝在 boost::function 中。
問題
考慮以下內容程式碼:
typedef void TriggerProc_type(Variable*,void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)> triggerProc ... InitVariable(triggerProc);
編譯此程式碼會導致下列錯誤:
error C2664: 'InitVariable' : cannot convert parameter 1 from 'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
會導致下列錯誤:
typedef void (*CallbackType)(int x, void* user_data); void RegisterCallback(CallbackType cb, void* user_data); void MyCallback(int x, void* userData) { boost::function<void(int)> pfn = static_cast<boost::function<void(int)> >(userData); pfn(x); } boost::function<void(int)> fn = boost::bind(myFunction(5)); RegisterCallback(MyCallback, &fn);
解決方案
建議的解決方案問題在於創建一個符合預期回調簽名的填充函數:
在此範例中,MyCallback 充當填充函數,將boost::function 轉換為相容的回呼。使用者資料參數用於儲存 boost::function 對象,允許 MyCallback 使用簡單的強制轉換來存取和執行它。
為什麼直接綁定並不總是可行
需要注意的是,雖然直接綁定綁定函子是一種選擇,但它可能並不總是合適。不平凡的 boost::function物件通常需要多個指針,這使得直接轉換為 C 風格回調具有挑戰性。 結論透過使用像 MyCallback 這樣的填充函數,可以有效地橋接boost::function 和 C 風格回呼之間的差距。這種方法可以實現無縫集成,並且可以在需要普通函數指標的場景中使用 boost::function。以上是如何將 boost::function 轉換為普通函式指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!