用C ++解压缩参数包

时间:2015-08-02 18:03:44

标签: c++ c++11 variadic-templates future argument-unpacking

我有两个函数operation system: windows wampserver gmail account 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解压缩类型?

2 个答案:

答案 0 :(得分:5)

[编辑2:我想我误解了这个问题,我忘了subzero想要返回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))...);
}

答案 1 :(得分:3)

以下是将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...>{});
}

Live on Coliru