Я хочу создать конечный автомат, который обрабатывает переданные сигналы в своем потоке. Я использую Visual Studio 2015, поэтому поддерживается С++ 11 и частично С++ 14. Сигналы хранятся в контейнерах. Каждый сигнал представлен как функция std::. Я хотел бы подождать от клиента до тех пор, пока машина состояния не обработает сигнал, который был отправлен, поэтому это своего рода синхронный сигнал.
Моя проблема: я не могу зафиксировать std:: prom в лямбда и добавить ее в контейнер.
#include <functional>
#include <future>
#include <list>
std::list<std::function<int()>> callbacks;
void addToCallbacks(std::function<int()>&& callback)
{
callbacks.push_back(std::move(callback));
}
int main()
{
std::promise<int> prom;
auto fut = prom.get_future();
// I have made the lambda mutable, so that the promise is not const, so that I can call the set_value
auto callback = [proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; };
// This does not compile
addToCallbacks(std::move(callback));
// This does not compile either, however this lambda is a temporal value (lvalue)
addToCallbacks([proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; });
return 0;
}
Каковы решения, если
- Я хочу избежать захвата обещания ссылкой
- Я хочу избежать захвата указателя * или shared_ptr для обещания
Было бы неплохо вложить обещание в класс так или иначе, как генерируется лямбда. Это означает, что лямбда больше не копируется, а только подвижная. Возможно ли вообще?