根据模板参数生成不同大小的初始化列表
Generate initializer list of varying size depending on template parameter
我有一个 class,其中包含一个没有默认构造函数的对象数组 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_sequence
和 std::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
成为新的构造函数。
我有一个 class,其中包含一个没有默认构造函数的对象数组 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_sequence
和 std::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
成为新的构造函数。