c ++ 11 — распаковка пакета параметров в переполнении стека

У меня две функции f а также g, f вычисляет возвращаемое значение асинхронно и возвращает будущее. Теперь на основе нескольких возвращаемых значений fЯ хочу позвонить g, но я хочу убедиться, что вычисления значений f происходить параллельно.

Рассмотрим следующий код:

template <typename T>
std::future<T> f(T& t);

template <typename... T>
void g(T&&... t)

template <typename... T>
void call_wrapper(T&&... t) {
auto f1 = f(t1); // How do I set the values of f1... fn
auto f2 = f(t2);
...
g(f1.get(), f2.get()....); // How do I call g
}

Как я могу распаковать типы из шаблона variadic T из call_wrapper функционировать?

5

Решение

[Edit2: я думаю, что я неправильно понял вопрос, я забыл, что минус хотел вернуться std::futureи просто подумал, что единственной проблемой является синтаксис пакета параметров.
Надеюсь, использование вспомогательной функции, как в моем первом редактировании, должно работать

Вы можете просто сделать:

template <typename... T>
void call_wrapper(T&&... t) {
g(f(std::forward<T>(t)).get()...);
}

Если я не понял, что вы хотите сделать.

Edit1: если вы хотите сделать что-то еще, вы можете разделить функцию на два вызова, например так:

template<typename... T>
void helper(T&&... t) {
// ...
g(std::forward<T>(t).get()...);
}

template <typename... T>
void call_wrapper(T&&... t) {
helper(f(std::forward<T>(t))...);
}
5

Другие решения

Вот быстрое решение для хранения std::futureв std::tuple :

template <class T, std::size_t... Idx>
void callG(T &tuple, std::index_sequence<Idx...>) {
g(std::get<Idx>(tuple).get()...);
}

template <typename... T>
void call_wrapper(T&&... t) {
auto results = std::make_tuple(f(std::forward<T>(t))...);
callG(results, std::index_sequence_for<T...>{});
}

Жить на Колиру

3