Sto scrivendo del codice multithreaded e utilizzo di promise/future per chiamare una funzione su un thread diverso e restituirne il risultato. Per simplicitly, mi tolgo la parte filettatura del tutto:Soddisfare una promessa (possibilmente nulla)
template <typename F>
auto blockingCall(F f) -> decltype(f())
{
std::promise<decltype(f())> promise;
// fulfill the promise
promise.set_value(f());
// block until we have a result
return promise.get_future().get();
}
Questa grande opera per qualsiasi funzione che restituisce non void
. E la dichiarazione di ritorno per il futuro funziona anche per void
. Ma non posso mantenere la promessa, se f
è una funzione di void
, perché:
promise.set_value (f()); // errore: utilizzo non valido di espressione vuoto
C'è un modo intelligente di impostare il valore nel caso void
in linea, o devo scrivere solo una funzione di supporto come call_set_value(promise, f)
che ha un overload per std::promise<R>
e std::promise<void>
?
Non ho le abilità di modello per farlo da solo, ma ho la sensazione che probabilmente si potrebbe SFINAE sul tipo di ritorno. – Borgleader
Che cosa è esattamente il punto di chiamare la funzione su un altro thread se stai solo aspettando che la chiamata sia terminata? (Escluso il caso ovvio di inviare la chiamata a un thread * specifico *) – cdhowie
Perché stai usando la promessa di basso livello - potresti semplicemente usare std :: future –