2014-09-27 47 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!!!"); 
} 
相關問題