使用非平凡的构造函数初始化对象的 std::array

Jat*_*tin 2 c++ stdarray

我有一个类定义为

class Edgelet
{
private:
    const int e_size;
    //Other private members...
public:
    //The constructor
    explicit Edgelet (int size, Color cl1 = Color::NA, Color cl2 = Color::NA);
    //Other public members...
Run Code Online (Sandbox Code Playgroud)

由于类中有一个const成员,因此编译器隐式删除了默认的复制构造函数。需要给它一个参数来初始化。

问题出在课堂上

class Cube
{
private:
    std::array <Edgelet, 12> c_edgelets;
    //Other members...
public:
    //The constructor
    Cube(int size)
    
    //Other public members...
Run Code Online (Sandbox Code Playgroud)

此类包含先前类对象的std::array。我如何初始化这个数组?所述尺寸参数需要被提供给的每个元素的std ::阵列初始化。我想将std::array 的每个元素设置为Edgelet(size - 2).

当然,我可以使用初始化列表,但由于构造函数有 12 个元素和其他参数,而不是显示,代码变得很难看。此外,我用 6 个元素而不是 12 个元素进行了类似的处理。

我还尝试为参数提供默认值,但由于有一个const成员,因此以后无法更改该值。我也尝试查看std::initializer_list但似乎您无法向其中添加新元素(或者您可以??)。有没有一种有效的方法来做到这一点?

Jar*_*d42 6

您可能会编写助手类:

template <std::size_t ... Is, typename T>
std::array<T, sizeof...(Is)> make_array_impl(const T& def, std::index_sequence<Is...>)
{
    return {{(Is, void(), def)...}};
}

template <std::size_t N, typename T>
std::array<T, N> make_array(const T& def)
{
    return make_array_impl(def, std::make_index_sequence<N>());
}
Run Code Online (Sandbox Code Playgroud)

进而

Cube(int size) : c_edgelets(make_array<12>(Edgelet(size - 2)) {}
Run Code Online (Sandbox Code Playgroud)