簡體   English   中英

使用 std::index_sequence 進行 std::array 初始化的包擴展

[英]Pack expansion for std::array initialization using std::index_sequence

我需要使用相同的構造函數 arguments 初始化一個帶有 N 個對象的 std:array,如std::vector<T>(size_t, {args...}) 從我在這里的搜索中我想出了這個,它有效:

template<typename T, size_t... Ints, typename... Args>
std::array<T, sizeof...(Ints)> make_array_(std::index_sequence<Ints...>, Args&&... args) {
    return { (Ints, T{args...})... };
}

template<typename T, size_t N, typename... Args>
std::array<T, N> make_array(Args&&... args) {
    return make_array_<T>(std::make_index_sequence<N>(), args...);
}

struct AStruct {
    AStruct(int a, float b) : a_{ a }, b_{ b } {}
private:
    int a_; float b_;
}

int main() {
    auto anArray = make_array<AStruct, 10>(8, 5.4f);
    // etc...
}

但我不明白第三行。 (Ints, T{args...})...如何轉換為T{args...}, T{args...}, T{args...}... N 次?

外部參數包沒有以您編寫的方式擴展,它像這樣擴展(內部包未顯示擴展,因為您似乎對此沒有問題):

return { (0, T{args...}), (1, T{args...}), (2, T{args}) };

其中整數的類型為std::size_t

(0, T{args...})是大括號括起來的初始值設定項的一個元素。 它是使用逗號運算符的表達式。 逗號運算符首先評估左側( 0 ),然后評估右側( T{args...} ),然后返回后者。

因為0的評估沒有副作用,並且它的值被逗號運算符丟棄,這實際上相當於

return { T{args...}, T{args...}, T{args...} };

對此有一個警告。 逗號運算符可以重載。 如果有一個重載接受std::size_t作為第一個參數和T作為第二個參數,那么這將以意想不到的方式表現,而是用重載的結果初始化返回值。 這可以通過將 integer 強制轉換為void來防止(它永遠不會作為重載運算符調用的參數出現):

return { (void(Ints), T{args...})... };

暫無
暫無

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

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