名稱空間
變體
操作

std::experimental::when_any

來自 cppreference.com
< 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)