2017-06-04 7 views
6

次の例は、C++ async tutorialから取られる:未来をそれを待たずに使う方法?

#include <future> 
#include <iostream> 
#include <vector> 

int twice(int m) { return 2 * m; } 

int main() { 
    std::vector<std::future<int>> futures; 
    for(int i = 0; i < 10; ++i) { futures.push_back (std::async(twice, i)); } 

    //retrive and print the value stored in the future 
    for(auto &e : futures) { std::cout << e.get() << std::endl; } 
    return 0; 
} 

は、どのように私はそれを待たずにfutureの結果を使用できますか?つまり、私はこのような何かやりたい:

int sum = 0; 
    for(auto &e : futures) { sum += someLengthyCalculation(e.get()); } 

を私はsomeLengthyCalculationfutureへの参照を渡すことができますが、いくつかの点で私は値を取得するためにgetを呼び出す必要があり、したがって、私はそれを記述する方法を知りません最初の要素が完了するのを待つことなく、次の要素が合計を開始できるようになります。

+0

あなたは 'then'と' when_all'または 'when_any'継続のような何かを探しています? – kreuzerkrieg

答えて

4

現在のfutureライブラリはまだ完成していません。私たちが見逃すのは、「未来のxがいつ準備できたら、始動fを」を指示する方法です。ここに素敵なpost about thatがあります。

マップ/リプレースの実装は、将来の完了ごとにアキュムレータに追加する(減らす)必要があります。

ライブラリを使用することができます。自分で構築するのはそれほど簡単ではありません。牽引力を得ているライブラリの1つにRxCppがあり、それらはpost on map/reduceです。

1

先物のデザインは、あなたが計算された値を表す多くの先物を作成するソリューションのこの種の、に自分自身を貸す:

std::vector<std::future<int>> calculated_futures; 

    for (auto &e : futures) { 
     calculated_futures.push_back(
      std::async([&e]{ return someLengthyCalculation(e.get()); }) 
    ); 
    } 

    int sum = 0; 
    for(auto &e : calculated_futures) { sum += e.get(); } 
+0

多分OPが助けられる答えのほうがもっと...ヒント:std :: futureをcalculate_futuresに変換してより良い意図を表現してください。 – xtofl

関連する問題