# std::experimental::when_any

< cpp‎ | experimental

定义于头文件 `<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` 非法则行为未定义。

具体而言，令 `Sequence` 对 (1) 为 std::vector<typename std::iterator_traits<InputIt>::value_type> ，对 (2) 为 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` 就绪时变为就绪。 `when_any_result` 的 `index` 成员含有 futures 成员中就绪的 `future` 或 `shared_future` 的位置。

1) 若范围为空（即 first == last ），则返回的 `future` 立即就绪； `when_any_result` 的 `futures` 域为空 `vector` ，而 `index` 域为 size_t(-1) 。
2) 若不提供参数，则返回的 `future` 立即就绪； `when_any_result` 的 `futures` 域为空 `tuple` ，而 `index` 域为 size_t(-1) 。