2017-08-08 2 views
0

私のような機能を持っている:私はメンバーの方法ではなく、Cスタイルの関数を呼び出すしたいので、私は、次のラムダ試してみましたC++、ラムダでtypedefを満たす?

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

:私はコンパイラを得るしかし

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

をエラー:

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

私の知る限り見ることができるように、ラムダは、typedefのような空の引数を持ち、かつtyepdefのようにvoidを返します。私は何が欠けていますか?それは状態をキャプチャする必要があるので

+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