Namespaces
Variants

std::experimental:: when_any

From cppreference.net
定义于头文件 <experimental/future>
template < class Sequence >

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

} ;
(并发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) (并发TS)
template < class ... Futures >

auto when_any ( Futures && ... futures )

- > future < when_any_result < std:: tuple < std:: decay_t < Futures > ... >>> ;
(2) (并发TS)

创建一个 future 对象,当至少一个输入的 future shared_future 就绪时,该对象将变为就绪状态。如果任何输入的 future shared_future 无效,则行为未定义。

具体而言,对于 (1) ,令 Sequence std:: vector < typename std:: iterator_traits < InputIt > :: value_type > ;对于 (2) ,令 Sequence std:: tuple < std:: decay_t < Futures > ... > 。此函数模板会创建一个包含 when_any_result<Sequence> 的共享状态,并返回指向该共享状态的future。每个输入的 future 会被移动到共享状态中 when_any_result<Sequence> futures 成员内的对应对象,而每个输入的 shared_future 会被复制到共享状态中 when_any_result<Sequence> futures 成员内的对应对象。 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 保持有效。

返回值

一个指向调用所创建共享状态的 future 。该future始终为 valid ( ) ,当调用中至少有一个输入 future shared_future 就绪时,该future将变为就绪状态。 when_any_result index 成员包含就绪的 future shared_future futures 成员中的位置。

1) 如果范围为空(即 first == last ),返回的 future 会立即就绪; when_any_result futures 字段是一个空向量, index 字段为 size_t ( - 1 )
2) 若未提供任何参数,返回的 future 将立即就绪; when_any_result futures 字段为空元组,且 index 字段值为 size_t ( - 1 )