2015-04-15 6 views
12

Ich habe eine Funktion, die einen Verweis auf ein std :: Versprechen zurück:C++ - Versprechen/Zukunft: Welche Rückkehr von einer Funktion?

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

(Weitere Informationen:. Die Funktion spielt Medien auf einem Gerät, und der Rückgabewert darstellt, wenn dieses Spiel abgeschlossen ist Wenn das Spiel ist genannt wird, ein zweites Mal, ein Wert zurückgegeben, das Versprechen zum ersten Mal, und ein neues Versprechen erstellt und kehrte für diesen zweiten Anruf)

der Anrufer kann dann den Wert fängt und auf der Zukunft warten:

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

Doe Ist es sinnvoll, einen Verweis auf die Zusage zurückzugeben, oder soll ich stattdessen die Zukunft zurückgeben, damit die aufrufende Funktion nicht get_future() aufrufen muss?

+0

Ein std :: promise/std :: future in einem std :: shared_ptr könnte fraglich sein (Es bricht das Nicht-Kopie-Konzept von std :: promise/std :: future) –

+0

Einverstanden; Die Datei shared_ptr wurde tatsächlich benötigt, um diese Probleme zu umgehen, da ich sie in einer Sammlung speichern und von einer Funktion zurückgeben wollte. Ich kann jedoch nicht sehen, wo dies Probleme verursachen würde. –

+1

@ScottM: Sie können auch 'std :: move' futures, wenn Sie dann in einer Sammlung speichern möchten, sagen' std :: vector > '. – Nawaz

Antwort

9

Da die Implementierung von play() ist nicht geschrieben, ich würde sagen, dass die meisten wahrscheinlich, dass Sie die Zukunft zurückkehren sollen, und die Funktion sollte mit dem Versprechen selbst, höchstwahrscheinlich in einem anderen Thread arbeiten. Die Begründung für dieses Design stammt aus der Tatsache, dass Versprechen ist ein Hersteller Ende, und Zukunft ist ein Verbraucher Ende — so würde die Funktion einen Wert, stellen Sie es durch die Verheißung Instanz, die die Zukunft, dass das Ergebnis über get angekommen ist benachrichtigt werden.

Beachten Sie jedoch, dass Sie std::shared_ptr<std::future<T>> — nicht einfach std::future<T> zurückgeben müssen würde großartig funktionieren.

Verwandte Themen