Namespaces
Variants

std::experimental:: when_any

From cppreference.net
Определено в заголовочном файле <experimental/future>
template < class Sequence >

struct when_any_result {
std:: size_t index ;
Sequence futures ;

} ;
(concurrency TS)
template < class InputIt >

auto when_any ( InputIt first, InputIt last )

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

auto when_any ( Futures && ... futures )

- > future < when_any_result < 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) . Этот шаблон функции создает общее состояние, содержащее when_any_result<Sequence> и возвращает future, ссылающийся на это общее состояние. Каждый входной future перемещается в соответствующий объект в члене futures структуры when_any_result<Sequence> в общем состоянии, а каждый входной shared_future копируется в соответствующий объект в члене futures структуры when_any_result<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 становится готовым. Член index структуры when_any_result содержит позицию готового future или shared_future в члене futures .

1) Если диапазон пуст (т.е., first == last ), возвращаемый future готов немедленно; поле futures структуры when_any_result является пустым вектором, а поле index равно size_t ( - 1 ) .
2) Если аргументы не предоставлены, возвращаемый future готов немедленно; поле futures в when_any_result представляет собой пустой кортеж, а поле index равно size_t ( - 1 ) .