在 C++ 中解压参数包
Unpacking Parameter Pack in C++
我有两个函数 f
和 g
。 f
异步计算它的 return 值,return 是一个未来。现在,基于 f
的几个 return 值,我想调用 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
}
如何从 call_wrapper
函数的可变参数模板 T
中解压类型?
[Edit2:我想我误解了这个问题,我忘记了 subzero 想要 return std::future
s 并且只是认为唯一的问题是参数包语法。
希望在我的第一次编辑中使用辅助函数应该可以工作]
你可以简单地做:
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))...);
}
这是一个将 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...>{});
}
我有两个函数 f
和 g
。 f
异步计算它的 return 值,return 是一个未来。现在,基于 f
的几个 return 值,我想调用 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
}
如何从 call_wrapper
函数的可变参数模板 T
中解压类型?
[Edit2:我想我误解了这个问题,我忘记了 subzero 想要 return std::future
s 并且只是认为唯一的问题是参数包语法。
希望在我的第一次编辑中使用辅助函数应该可以工作]
你可以简单地做:
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))...);
}
这是一个将 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...>{});
}