Implementierung von future :: then () -Äquivalent für die asynchrone Ausführung in c ++ 11

Ich habe einige Fragen zur Implementierung der Funktionthen() imHerb Sutters Vortrag. Diese Funktion wird verwendet, um asynchrone Vorgänge, den Parameter, zu verkettenf ist eine Zukunft aus einer Operation und dem Parameterw ist die 'Arbeit' für diese Operation (Lambda).

template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
    return async([=]{ w(f.get()); });
}

Ein Anwendungsbeispiel wäre:

    std::future<int> f = std::async([]{
        std::this_thread::sleep_for(std::chrono::microseconds(200));
        return 10;
    });

    auto f2 = then(std::move(f), [](int i){
        return 2 * i;
    });

Der Hauptthread erzeugt die Tasks, wartet jedoch nicht darauf, dass einer der Tasks beendet wird.

Zuerst,future<T> hat keinen Kopierkonstruktor. Dies bedeutet, dass die vorgeschlagene Implementierung nur mit verwendet werden kannshared_future<T> es sei denn, wir ändern den Anruf aufasync() die Zukunft in den Lambda zu bewegen.Diese SO Frage schlug einen Weg vor, es zu tun, aber es scheint zu kompliziert. Ich habe die Funktion neu implementiert und frage mich, ob mein Code korrekt ist oder ob ich etwas verpasst habe ...

Zweitens die Zukunft, die an die Bundesregierung übergeben wirdthen() Funktion könnte seinvoid Wir brauchen also 2 Implementierungen vonthen(), Recht? Eine für die Rückkehr von FuturesT und eine für die Rückkehr von Futuresvoid.

Schließlich sollte das Lambda im Körper vonthen() Haben Sie keine return-Anweisung, damit wir den Wert tatsächlich zurückgeben können? Ohne die return-Anweisung kehrt dann zurückfuture<void>, Recht?

Ich habe versucht, die oben genannten Punkte anzusprechen, und das habe ich mir ausgedacht. Ist es richtig?

template <typename T, typename Work>
auto then(future<T> f, Work w) -> future<decltype(w(f.get()))>
{
    return async([](future<T> f, Work w)
                      { return w(f.get()); }, move(f), move(w));
}

template <typename Work>
auto then(future<void> f, Work w) -> future<decltype(w())>
{
    return async([](future<void> f, Work w)
                      { f.wait(); return w(); }, move(f), move(w));
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage