根据模板参数生成不同大小的初始化列表

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_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 成为新的构造函数。