如何在C ++中组合两个参数包的值? 换句话说,如何编写函数
LetsStart<int, -1, 10, 3>("This is -1", "And this is 10", "3!!!");
将输出
-1 This is -1
10 And this is 10
3 3!!!
即它应该从第一个包中选择第一个值,从第二个包中选择第一个值,然后从两个包中选择第二个值,然后从两个包中选择第三个值,等等......
在我尝试的第一次尝试这样的事情
template<class T, T... Firsts, class TSecond>
void LetsStart(TSecond... Seconds) {
Output((Firsts, Seconds)...);
}
但这不起作用......
//我当然是wrote this function,但我相信存在更多正确而简单的方法来完成这项任务。那么,你能指出我的方式吗?
答案 0 :(得分:1)
在C ++ 11中,您可以使用以下函数:
template<typename T, T... V, typename F, typename... A>
void f(F &&f, A&&... args) {
static_assert(sizeof...(V) == sizeof...(A), "Argument lists size mismatch");
int arr[] = { 0, (std::forward<F>(f)(V, std::forward<A>(args)), 0)... };
(void)arr;
}
它接受两个请求参数列表和一个额外函数F
,然后解压缩参数并将每个列表的第N 传递给给定函数。
如果没有提供参数,它也应该起作用。
在C ++ 17中,您可以按照以下方式重写它:
template<typename T, T... V, typename F, typename... A>
void f(F &&f, A&&... args) {
static_assert(sizeof...(V) == sizeof...(A));
(std::forward<F>(f)(V, std::forward<A>(args)), ...);
}
在这两种情况下,我都检查了两个列表的大小是否相同,因为在这种情况下没有指定要做什么。
您可以使用下面的示例main
测试这两个函数:
#include<utility>
#include<iostream>
// ...
int main() {
auto l = [](auto v, auto s) { std::cout << v << " " << s << std::endl; };
f<int, -1, 10, 3>(l, "This is -1", "And this is 10", "3!!!");
}
答案 1 :(得分:1)
C ++ 11版本:
CE:https://gcc.godbolt.org/z/xIUL1J
#include<iostream>
template<class... T>
void LetsStart(){}
template<class T, class U>
void print(T t, U u)
{
std::cout << t << " " << u << '\n';
}
template<class T, T f, T... ts, class A, class... Arg>
void LetsStart(A&& a, Arg&&... args){
print(f, a);
LetsStart<T, ts...>(args...);
}
void foo() {
LetsStart<int, -1, 10, 3>("This is -1", "And this is 10", "3!!!");
}