簡體   English   中英

將可變參數函數模板的每個參數傳遞給返回void的函數

[英]Passing each argument of a variadic function template into a function that returns void

根據這里找到的配方,我寫了以下內容:

void printInt(int a) {std::cout << a << std::endl;}

template <typename... Args>
void f(const Args &... args) {
    auto temp = {(printInt(args), void(), 0)...};
    auto a = temp; temp = a;
}

兩個問題:

  1. 這個語法是什么意思: {(printInt(args), void(), 0)...}

  2. 我添加了行auto a = temp; temp = a; auto a = temp; temp = a; 為了不獲得有關未使用的變量temp的警告。 有沒有更好的辦法?


在回復和評論中的解釋之后,剩下的唯一問題是:為什么C ++不允許這樣做:

template <typename... Args>
void f(const Args &... args) {
    printInt(args)...;
} 

引用的帖子中提到了這個問題,但未收到任何答復。

  1. 這個語法的意思是, temp將被std::initializer_list<int>填充零,由於逗號運算符規則(將評估所有表達式,但只使用last,因此,將為每個參數調用函數printInt ,0將被推到每個參數的初始化列表中)。

N4296 5.19 / 1

用逗號分隔的一對表達式從左到右進行評估; 左表達式是丟棄值表達式(第5條)。 87在與右表達式關聯的每個值計算和副作用之前,對與左表達式相關聯的每個值計算和副作用進行排序。 結果的類型和值是右操作數的類型和值; 結果與右操作數具有相同的值類別,如果右操作數是glvalue和位域,則是一個位域。 如果右操作數的值是臨時值(12.2),則結果是臨時值。

{(printInt(args), void(), 0)...};

()是用於包擴展,所以, ...將應用於完整表達式, void()在這里屏蔽構造對類重載操作符,(感謝Quentin),你也可以使用以下

{((void)printInt(args), 0)...};

此外,它會更好用

{0, ((void)printInt(args), 0)...};

對於initializer_list中的至少一個元素(所以你可以不帶參數調用f )。

  1. 你可以使用(void)temp; 標記變量未使用,這里有更多信息: (void)'變量名'在C函數的開頭做了什么?

暫無
暫無

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

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