3

Lambda コールバックをパラメーターとして取得する C++ 関数を実装しようとしています。問題は、コールバックが同じ (呼び出された) クラスの別の関数から非同期的に開始されることです。したがって、コールバックを開始する必要がある非同期関数からアクセスできるように、Lambda をメンバー変数に格納する必要があります。

メンバー変数を使用して Lambda を宣言、設定、および呼び出すために考えられるすべての方法を試しましたが、コードは割り当てまたは呼び出しで常にクラッシュします。

これは、私がやろうとしていることの削除されたバージョンです。

関数の宣言:

void function(const std::function<void()>callback);

メインコードから関数を呼び出す:

myClass->function([](){cout << "Callback called";});

callback内部から実行すると正常に動作しますが、それをメンバー変数 (例: ) に格納して、同じクラスの別の関数から呼び出すfunction方法が見つかりませんでした。m_callback

4

2 に答える 2

5

これはうまくいくはずです:

#include <functional>
#include <utility>

struct MyThing
{
    std::function<void()> f_;

    void SetCallback(std::function<void()> f) { f_ = std::move(f); }

    void Action() { f_(); }
};

使用法:

#include <iostream>

MyThing thing;

thing.SetCallback([](){ std::cout << "Boo\n"; });
thing.Action();
于 2013-10-27T18:47:14.520 に答える
1

std::function 変数を作成して呼び出すだけです。

#include <iostream>
#include <functional>

struct A{
    std::function<void()> cb;

    void function(const std::function<void()>callback){
        cb=callback;
    }
};

int main() {
    A a;

    a.function([](){std::cout << "Callback called";});

    a.cb();

}
于 2013-10-27T18:50:09.443 に答える