[英]Passing lambdas as callbacks to C functions
假設我有一個C函數
typedef void (* callback_t)(void* data);
status_you_dont_care_about register_callback(callback_t callback, void* data);
我想傳遞一個lambda作為回調。
慣用的方式是什么?
正如評論者所指出的,lambda隱式地轉換為適當類型的函數指針,因此我們可以這樣寫:
auto my_lambda = [](void* data) { /* do stuff here */};
register_callback(my_lambda, get_pointer_to_data());
這將編譯。 不要忘了檢查返回值:-)
這是我目前正在做的事情,但我懷疑它不是最理想的。
首先,我確保lambda捕獲了它需要的所有內容,這樣它本身就可以調用而沒有任何參數(這樣它實際上就不會像預期的回調那樣采用void*
)。 然后我使用以下代碼:
template <typename Invokable>
void callback_adapter(void *invokable_on_heap)
{
auto retyped_callback = std::unique_ptr<Invokable>{
reinterpret_cast<Invokable*>(invokable_on_heap)
};
(*retyped_callback)(std::forward<Ts>(parameters)...);
// Note: invokable_on_heap will be delete'd
}
template <typename Invokable>
void register_invokable_as_callback(Invokable callback_) {
Invokable* invokable_on_the_heap = new Invokable(std::move(callback_));
register_callback(&callback_adapter<Invokable>, invokable_on_the_heap);
}
注意:使用這種方法,回調只能被調用一次。 它可以適應需要多次調用的回調的情況,在取消注冊/銷毀所有需要調用的回調時進行釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.