C++ 使用std::index_序列进行std::数组初始化的包扩展
我需要初始化一个std:array,其中N个对象采用相同的构造函数参数,如C++ 使用std::index_序列进行std::数组初始化的包扩展,c++,templates,index-sequence,C++,Templates,Index Sequence,我需要初始化一个std:array,其中N个对象采用相同的构造函数参数,如std::vector(size\t,{args…})中所示。通过我在这里的搜索,我得出了一个有效的结论: template<typename T, size_t... Ints, typename... Args> std::array<T, sizeof...(Ints)> make_array_(std::index_sequence<Ints...>, Args&&
std::vector(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...
}
模板
std::数组生成\数组(std::索引\序列,Args&…Args){
返回{(Ints,T{args…})…};
}
模板
std::数组生成_数组(Args&&…Args){
返回make_数组(std::make_index_sequence(),args…);
}
结构构造{
AStruct(inta,float b):a{a},b{b}
私人:
int a_uu;;float b_uuuu;;
}
int main(){
自动阵列=制作阵列(8,5.4f);
//等等。。。
}
但我不明白第三行。
(Ints,T{args…})
如何转换为T{args…},T{args…},T{args…}…
N次?外部参数包没有以您编写的方式展开,它是这样展开的(内部包没有显示展开,因为您似乎没有遇到问题):
其中整数的类型为std::size\u t
(0,T{args…})
是括号内初始值设定项的一个元素。它是一个使用逗号运算符的表达式。逗号运算符首先计算左侧(0
),然后计算右侧(T{args…}
),返回后者
由于0
的求值没有副作用,并且其值被逗号运算符丢弃,因此这实际上相当于
return { T{args...}, T{args...}, T{args...} };
对此有一个警告。逗号运算符可以重载。如果有一个重载接受std::size_t
作为第一个参数和t
作为第二个参数,那么这将以一种意外的方式运行,用重载的结果初始化返回值。这可以通过将整数强制转换为void
(它永远不能作为重载运算符调用的参数出现)来防止:
逗号运算符。。。我总是忘记这件事。谢谢
return { T{args...}, T{args...}, T{args...} };
return { (void(Ints), T{args...})... };