命名空间
变体
操作

std::experimental::when_any

来自 cppreference.cn
定义于头文件 <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 对象,当至少一个输入 futureshared_future 准备就绪时,该对象变为就绪状态。如果任何输入 futureshared_future 无效,则行为未定义。

特别地,对于 (1),设 Sequencestd::vector<typename std::iterator_traits<InputIt>::value_type>;对于 (2),设 Sequencestd::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::futurestd::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(),并且当调用的至少一个输入 futureshared_future 准备就绪时,它变为就绪状态。when_any_resultindex 成员包含 futures 成员中就绪的 futureshared_future 的位置。

1) 如果范围为空(即 first == last),则返回的 future 立即就绪;when_any_resultfutures 字段是一个空 vector,并且 index 字段是 size_t(-1)
2) 如果未提供任何参数,则返回的 future 立即就绪;when_any_resultfutures 字段是一个空 tuple,并且 index 字段是 size_t(-1)