2014-09-27 81 views
1

如何组合来自C++中两个参数包的值? 换句话说,如何写功能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!!! 

也就是说,它应该选择来自两个包装中,第一包装和从第二组第一值,则第二值第一值,则来自包装等3个值...

在第一个我尝试我想是这样的

template<class T, T... Firsts, class TSecond> 
void LetsStart(TSecond... Seconds) { 
    Output((Firsts, Seconds)...); 
} 

但这不起作用...

//当然我wrote this function,但我相信存在更正确和简单的方法来完成此任务。那么,你能指出我的方式吗?

+0

的想法是存储在元组的每个包(或其他类),然后通过索引遍历这两个元组'N:

可以用下面的例子中main测试两种功能从'0'到'sizeof ...(Firsts)'。我会开始回答这个问题,如果我不认为最终的课程有点无用......你对此有什么想法? – davidhigh 2014-09-27 20:55:07

+0

我不太了解这个要求,但为什么你不能只使用地图? – 2014-09-27 21:00:04

+0

你在正确的轨道上;在这种情况下你不能扩展参数包。允许扩展的一种上下文是braced-init-list:http://coliru.stacked-crooked.com/a/0c4980989603a770 – dyp 2014-09-27 21:01:29

回答

0

在C++ 11,则可以使用下面的函数:

template<typename T, T... V, typename F, typename... A> 
void f(F &&f, A&&... args) { 
    static_assert(sizeof...(V) == sizeof...(A)); 
    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)), ...); 
} 

在我已经签了两个列表具有相同的大小两种情况下,它没有规定在做什么这样的情况。

#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!!!"); 
} 
相关问题