[英]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;
}
兩個問題:
這個語法是什么意思: {(printInt(args), void(), 0)...}
?
我添加了行auto a = temp; temp = a;
auto a = temp; temp = a;
為了不獲得有關未使用的變量temp
的警告。 有沒有更好的辦法?
在回復和評論中的解釋之后,剩下的唯一問題是:為什么C ++不允許這樣做:
template <typename... Args>
void f(const Args &... args) {
printInt(args)...;
}
引用的帖子中提到了這個問題,但未收到任何答復。
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
)。
(void)temp;
標記變量未使用,這里有更多信息: (void)'變量名'在C函數的開頭做了什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.