命名空间
变体
操作

std::experimental::when_all

来自 cppreference.com
定义在头文件 <experimental/future>
template< class InputIt >

auto when_all( InputIt first, InputIt last )

    -> future<std::vector<typename std::iterator_traits<InputIt>::value_type>>;
(1) (并发 TS)
template< class... Futures >

auto when_all( Futures&&... futures )

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

创建一个 future 对象,当所有输入 futureshared_future 都准备好时,它将变为就绪。如果任何输入 futureshared_future 无效,则行为未定义。

特别是,令 Sequencestd::vector<typename std::iterator_traits<InputIt>::value_type> 用于 (1) 以及 std::tuple<std::decay_t<Futures>...> 用于 (2)。此函数模板创建一个包含 Sequence 的共享状态,并返回引用该共享状态的 future。每个输入 future 都被移动到共享状态中 Sequence 中的对应对象,每个输入 shared_future 都被复制到共享状态中 Sequence 中的对应对象。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 中的每个类型 Fnstd::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 都准备好时,它将变为就绪。

1) 如果范围为空(即 first == last),则返回的 future 包含一个空向量,并且立即就绪。
2) 如果没有提供参数,则返回 future<std::tuple<>>,它将立即就绪。