2015-04-15 20 views
12

Ho una funzione che restituisce un riferimento a uno std :: promessa:Promessa/futuro C++: quale ritorno da una funzione?

std::shared_ptr<std::promise<void>> play(); 

(Maggiori informazioni:. La funzione di riprodurre supporti su alcuni dispositivi, e il valore restituito rappresenta quando questo gioco è completo Se il gioco è chiamato una seconda volta, un valore non è impostato sulla promessa restituito la prima volta, e viene creata una nuova promessa e restituito per questa seconda convocazione)

il chiamante può quindi cogliere il valore e attendere sul futuro:

auto this_future = play()->get_future(); 
this_future.wait(); 

Doe s ha senso restituire un riferimento alla promessa, o dovrei invece restituire il futuro, in modo che la funzione chiamante non debba chiamare get_future()?

+0

Avere uno std :: promise/std :: future in un file std :: shared_ptr potrebbe essere discutibile (rompe il concetto di non copia di std :: promise/std :: future) –

+0

concordato; il shared_ptr era effettivamente necessario per aggirare questi problemi di non copia, poiché volevo archiviarli in una raccolta e restituirli da una funzione. Tuttavia, non riesco a vedere dove ciò potrebbe causare problemi. –

+1

@ScottM: Puoi anche passare al futuro 'std :: move' se vuoi memorizzare in una raccolta, ad esempio' std :: vector > '. – Nawaz

risposta

9

Dal momento che l'attuazione di play() è non pubblicato, direi che molto probabilmente è necessario restituire il futuro, e la funzione dovrebbe funzionare con la promessa in sé, molto probabilmente in un thread diverso. La logica di questo design deriva dal fatto che la promessa è un fine produttore, e il futuro è un consumatore finale — quindi la funzione produrrebbe un valore, impostandolo attraverso l'istanza di promessa, che notificherà al futuro che il risultato è arrivato attraverso get.

Tuttavia, si noti che, non è necessario restituire uno std::shared_ptr<std::future<T>> — solo std::future<T> funzionerebbe benissimo.