implementacja future :: then () odpowiednika dla wykonywania asynchronicznego w c ++ 11

Mam kilka pytań dotyczących implementacji funkcjithen() wRozmowa Herb Suttera. Ta funkcja służy do łączenia parametrów asynchronicznychf to przyszłość z jednej operacji i parametruw jest „pracą” dla tej operacji (lambda).

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

Przykładem zastosowania może być:

    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;
    });

Główny wątek tworzy zadania, ale nie czeka na zakończenie żadnego z nich.

Po pierwsze,future<T> nie ma konstruktora kopii. Oznacza to, że sugerowana implementacja może być używana tylko zshared_future<T> chyba że zmienimy połączenie naasync() przenieść przyszłość w lambdę.To pytanie SO zasugerował sposób na zrobienie tego, ale wydaje się zbyt skomplikowany. Ponownie zaimplementowałem funkcję i zastanawiam się, czy mój kod jest poprawny, czy też coś przeoczyłem ...

Po drugie, przyszłość przekazywanathen() funkcja może byćvoid więc potrzebujemy 2 implementacjithen(), dobrze? Jeden dla transakcji terminowychT i jeden dla transakcji terminowychvoid.

Wreszcie, lambda wewnątrz ciałathen() nie masz instrukcji zwrotu, abyśmy mogli zwrócić wartość z powrotem? Bez instrukcji powrotu, a następnie wracafuture<void>, dobrze?

Próbowałem zająć się powyższymi punktami i oto, co wymyśliłem. Czy to jest poprawne?

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));
}

questionAnswers(3)

yourAnswerToTheQuestion