13 constexpr bool kAllVoid_ = (is_void_v<invoke_result_t<I>> && ...);
15 tuple<future<invoke_result_t<I>>...> futures;
18 [&]<
size_t... Idx> (index_sequence<Idx...>) { ((get<Idx> (futures) = async (launch::async, functions)), ...); }(index_sequence_for<I...>{});
21 if constexpr (kAllVoid_) {
23 [&]<
size_t... Idx> (index_sequence<Idx...>) { (get<Idx> (futures).get (), ...); }(index_sequence_for<I...>{});
27 return [&]<
size_t... Idx> (index_sequence<Idx...>) {
28 return tuple_cat ([&] () {
29 if constexpr (not is_void_v<invoke_result_t<tuple_element_t<Idx, tuple<I...>>>>) {
30 return make_tuple (get<Idx> (futures).get ());
33 get<Idx> (futures).get ();
37 }(index_sequence_for<I...>{});