[英]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.