2017-08-08 54 views
0

我有一個功能,如:C++,使用lambda實現typedef?

typedef void(*timercallback)(void); 
void timer1_attachInterrupt(timercallback userFunc); 

我想調用成員方法,而不是C風格的函數,所以我曾嘗試以下拉姆達:

timer1_attachInterrupt([this](void) -> void { _member_method(); }); 

但是我得到的編譯器錯誤:

No suitable conversion function from "lambda [] void() -> void" to "timercallback" exists

據我所見,lambda具有類似於typedef的void參數,並返回void類似於tyepdef。我錯過了什麼?

+0

Arundo?如果是這樣添加標籤。 – Yakk

回答

4

What am I missing?

拉姆達創建一個封閉對象,因爲它需要捕捉狀態。因此,您不能僅僅在需要常規函數指針的地方傳遞它。

由於您的API沒有對傳遞狀態給回調做任何規定,所以您需要使用像全局變量這樣令人不快的東西。

如果可以修改timer1_attachInterrupt ,那麼我建議你允許它接受任何(類型擦除)仿函數。 std::function僅僅是實現這一目標的工具:

using timercallback = void(void); 
void timer1_attachInterrupt(std::function<timercallback> userFunc); 

這是很清楚的OP不能編輯後。但是我可以給任何可能修改功能的人留下建議。

+0

我無法修改timer1_attachInterrupt。我之前使用全局變量,並且必須將大部分數據存儲在類之外。我試圖讓它更多一點OO。 –

+0

@uhsl_m - 你的困境純粹是由於糟糕的API設計。全球化的狀態。 – StoryTeller