簡體   English   中英

如何使用折疊表達式擴展為初始化列表?

[英]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;
}

這是 OnlineGDB 上的源代碼。

預期 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.

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