Desidero creare una macchina a stati che lavori elabora i segnali inviati nella propria thread. Uso Visual Studio 2015, quindi C++ 11 e parzialmente C++ 14 sono supportati. I segnali sono memorizzati in contenitori. Ogni segnale è rappresentato come una funzione std ::. Vorrei aspettare dal client fino a quando la macchina di stato elabora il segnale che è stato inviato, quindi è una sorta di segnale sincrono.Cattura std :: promise in a lambda C++ 14
Il mio problema è: non riesco a catturare uno std :: promise in un lambda e aggiungerlo al contenitore.
#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;
}
Quali sono le soluzioni, se
- voglio evitare la cattura la promessa con riferimento
- voglio evitare la cattura un puntatore * o uno shared_ptr alla promessa
Sarebbe bello inserire la promessa nella classe in qualche modo che il lambda genera. Ciò significa che la lambda non è più copiabile, solo mobile. È possibile a tutti?
Design: non usare 'std :: list' meno che davvero, davvero bisogno di stabilità iteratore. Il tuo obiettivo è avere il "valore di ritorno" entrambi visualizzati in futuro (che è disgiunto da qualche parte), e nel valore di ritorno della funzione che chiami? – Yakk