簡體   English   中英

c ++組合來自兩個(或更多)參數包的值

[英]c++ combine values from two (or more) parameter packs

如何在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)...);
}

但這不起作用......

//當然我寫了這個函數 ,但我相信有更多正確而簡單的方法來完成這個任務。 所以,你能指出我的方式嗎?

在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!!!");
}

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!!!");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM