命名空间
变体
操作

std::experimental::when_any

来自 cppreference.cn
< cpp‎ | 实验性
定义于头文件 <experimental/future>
template< class Sequence >

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

};
(并发技术规范)
template< class InputIt >

auto when_any( InputIt first, InputIt last )

    -> future<when_any_result<std::vector<typename std::iterator_traits<InputIt>::value_type>>>;
(1) (并发技术规范)
template< class... Futures >

auto when_any( Futures&&... futures )

    -> future<when_any_result<std::tuple<std::decay_t<Futures>...>>>;
(2) (并发技术规范)

创建一个 `future` 对象,当至少一个输入 `future` 和 `shared_future` 准备就绪时,该 `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` 都被移动到共享状态中 `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(),当调用中的至少一个输入 `future` 和 `shared_future` 准备就绪时,它也准备就绪。`when_any_result` 的 `index` 成员包含 `futures` 成员中准备就绪的 `future` 或 `shared_future` 的位置。

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