Хранить C ++ лямбду в переменной-члене, которая будет использоваться в качестве обратного вызова?

Я пытаюсь реализовать функцию C ++, которая получает Lambda обратный вызов в качестве параметра. Дело в том, что обратный вызов инициируется асинхронно из другой функции в том же (вызываемом) классе. Поэтому мне нужно сохранить Lambda в переменной-члене, чтобы к ней мог обращаться асинхронная функция, которая должна инициировать обратный вызов.

Я перепробовал все возможные способы объявления, установки и вызова Lambda с помощью переменной-члена, но код всегда дает сбой либо в присваивании, либо в вызове.

Вот вычеркнутая версия того, что я пытаюсь сделать.

Объявление функции:

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

Вызов функции из основного кода:

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

Если я выполню callback изнутри function он работает нормально, но я не смог найти способ сохранить его в переменной-члене (например, m_callback) и вызвать его из другой функции того же класса.

3

Решение

Это должно работать:

#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();
5

Другие решения

Просто создайте переменную 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();

}
1

По вопросам рекламы [email protected]