Namespaces
Variants

std::experimental:: when_all

From cppreference.net
定義済みヘッダ <experimental/future>
template < class InputIt >

auto when_all ( InputIt first, InputIt last )

- > future < std:: vector < typename std:: iterator_traits < InputIt > :: value_type >> ;
(1) (concurrency TS)
template < class ... Futures >

auto when_all ( Futures && ... futures )

- > future < std:: tuple < std:: decay_t < Futures > ... >> ;
(2) (concurrency TS)

入力されたすべての future および shared_future が準備完了状態になったときに準備完了となる future オブジェクトを作成します。入力された future または shared_future が無効な場合、動作は未定義です。

特に、 Sequence std:: vector < typename std:: iterator_traits < InputIt > :: value_type > とし( (1) の場合)、 std:: tuple < std:: decay_t < Futures > ... > とし( (2) の場合)。この関数テンプレートは Sequence を含む共有状態を作成し、その共有状態を参照するfutureを返します。各入力 future は共有状態内の Sequence の対応するオブジェクトへ移動され、各入力 shared_future は共有状態内の Sequence の対応するオブジェクトへコピーされます。 Sequence 内のオブジェクトの順序は引数の順序と一致します。

1) この関数は、以下の条件を満たさない限りオーバーロード解決に参加しません: InputIt の値型(すなわち、 typename std:: iterator_traits < InputIt > :: value_type )が std::experimental::future または std::experimental::shared_future である場合のみ。
2) この関数は、すべての引数が(CV修飾可能性のある) std::experimental::shared_future またはCV非修飾の std::experimental::future である場合に限り、オーバーロード解決に参加します。(形式的には、 Futures 内のすべての型 Fn について、 std:: remove_reference_t < Fn > std:: experimental :: future < Rn > であるか、または std:: decay_t < Fn > std:: experimental :: shared_future < Rn > であるかのいずれかです。)

この呼び出しの後、すべての入力 future は無効になります。すべての入力 shared_future は有効なままです。

戻り値

A future が参照する共有状態は、この呼び出しによって作成されます。このfutureは常に valid ( ) であり、呼び出しのすべての入力 future shared_future が準備完了状態になると、このfutureも準備完了状態になります。

1) 範囲が空の場合(つまり、 first == last )、返される future は空のベクターを含み、即座に準備完了状態になります。
2) 引数が提供されない場合、 future<std::tuple<>> が返され、即座に準備完了状態となります。