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 , который становится готовым, когда все входные future и shared_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 's тип значения (т.е., typename std:: iterator_traits < InputIt > :: value_type ) не является std::experimental::future или std::experimental::shared_future .
2) Эта функция не участвует в разрешении перегрузки, если каждый аргумент не является (возможно, cv-квалифицированным) std::experimental::shared_future или неквалифицированным cv std::experimental::future . (Формально, для каждого типа Fn в Futures , либо std:: remove_reference_t < Fn > является std:: experimental :: future < Rn > , либо std:: decay_t < Fn > является std:: experimental :: shared_future < Rn > .)

После этого вызова каждый входной future становится недействительным; каждый входной shared_future остается действительным.

Возвращаемое значение

Объект future , ссылающийся на общее состояние, созданное вызовом. Этот future всегда valid ( ) и переходит в состояние готовности, когда все входные future и shared_future , переданные в вызов, становятся готовыми.

1) Если диапазон пуст (т.е., first == last ), возвращаемый future содержит пустой вектор и готов немедленно.
2) Если аргументы не предоставлены, возвращается future<std::tuple<>> и он немедленно готов.