首頁 > 後端開發 > C++ > 主體

如何將 boost::function 轉換為普通函式指標?

Barbara Streisand
發布: 2024-11-11 18:08:03
原創
902 人瀏覽過

How to Convert a boost::function to a Plain Function Pointer?

將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, &amp;fn);
登入後複製

解決方案

建議的解決方案問題在於創建一個符合預期回調簽名的填充函數:

在此範例中,MyCallback 充當填充函數,將boost::function 轉換為相容的回呼。使用者資料參數用於儲存 boost::function 對象,允許 MyCallback 使用簡單的強制轉換來存取和執行它。

為什麼直接綁定並不總是可行

需要注意的是,雖然直接綁定綁定函子是一種選擇,但它可能並不總是合適。不平凡的 boost::function物件通常需要多個指針,這使得直接轉換為 C 風格回調具有挑戰性。 結論透過使用像 MyCallback 這樣的填充函數,可以有效地橋接boost::function 和 C 風格回呼之間的差距。這種方法可以實現無縫集成,並且可以在需要普通函數指標的場景中使用 boost::function。

以上是如何將 boost::function 轉換為普通函式指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板