根据模板参数生成不同大小的初始值设定项列表



我有一个类,其中包含一个对象数组,T没有默认构造函数。下面是一个示例:

#include <iostream>
struct Param {
int x;
};
struct A {
A(const Param &p) {
std::cout << p.x << std::endl;
}
};
template<class T, int n>
struct Array {
T data[n];
/*     n times     */
Array(const Param &p) : data{/* T(p), ..., T(p) */} { }
};
int main() {
Param p{42};
Array<A, 3> arr(p);
return 0;
}

我正在寻找一种使用不同大小的元素初始值设定项列表来初始化data字段的方法T(p)该列表正好包含n元素。我有一种感觉,可以通过像std::make_index_sequence这样的结构来实现,但我没有找到任何合适的东西。

我想你可以使用委派构造器,std::index_sequencestd::make_index_sequence并重写Array如下(编辑:答案由SergeyA和Rakete1111改进;谢谢!

template <typename T, std::size_t N>
struct Array
{
T data[N];
template <std::size_t ... Is>
Array (Param const & p, std::index_sequence<Is...> const &)
: data { ((void)Is, T{p}) ... }
{ }
Array(const Param &p) : Array{p, std::make_index_sequence<N>{}}
{ }
};

也许你可以private新的构造函数。

最新更新