std::experimental::when_any

来自cppreference.com
定义于头文件 <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 非法则行为未定义。

具体而言,令 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::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)