簡體   English   中英

將lambda作為回調傳遞給C函數

[英]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作為回調。

慣用的方式是什么?

  1. 當lambda什么也沒捕獲到嗎?
  2. 當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM