5

我有两个功能fg. 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
}

如何从函数的可变参数模板T中解压缩类型call_wrapper

4

2 回答 2

5

[Edit2:我想我误解了这个问题,我忘记了 subzero 想要返回std::futures 并且只是认为唯一的问题是参数包语法。希望在我的第一次编辑中使用辅助函数应该可以工作]

你可以简单地做:

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))...);
}
于 2015-08-02T18:07:42.727 回答
3

std::future这是将s存储在 a 中的快速解决方案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...>{});
}

住在科利鲁

于 2015-08-02T18:23:45.683 回答