![](/img/trans.png)
[英]Initializer list, parameter pack expansion, fold expressions and order of evaluation
[英]How to expand into initializer list with fold expressions?
我想在向量中插入盡可能多的零,因為 arguments 到可變參數模板化的 function (即向量中的 arguments 零的數量)。 我正在嘗試使用折疊表達式來實現這一點,並且在使用(vec.push_back(zeroHelper(args)), ...);
.
我不明白的是:為什么當我嘗試通過“展開”到初始化器列表中直接初始化向量時它不起作用,如下所示:
std::vector<int> vec = { (zeroHelper(args), ...) };
?
完整源代碼:
template <typename T>
T zeroHelper (T a) { return T{0}; }
template<typename ...Args>
void printer(Args&&... args) {
std::vector<int> vec; // = { (zeroHelper(args), ...) };
(vec.push_back(zeroHelper(args)), ...);
for (auto i : vec) {
std::cout << i << '\n';
}
}
int main()
{
printer(1, 2, 3, 4);
return 0;
}
預期 output:
0
0
0
0
Output 與初始化列表方法:
0
為什么?
因為在
std::vector<int> vec = { (zeroHelper(args), ...) };
括號只返回一個元素,最后一個; 逗號運算符丟棄前面的內容。
你應該寫
std::vector<int> vec = { zeroHelper(args) ... };
維護所有元素。
在
(vec.push_back(zeroHelper(args)), ...);
括號激活折疊,逗號丟棄除最后一個之外的所有元素,但push_back()
操作適用於每個args...
元素的vec
。
還要注意,使用逗號運算符的丟棄特性,您根本不需要zeroHelper()
你可以寫
std::vector<int> vec { ((void)args, 0)... };
或者
(vec.push_back(((void)args, 0)), ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.