C++ 使用非平凡构造函数初始化std::对象数组

C++ 使用非平凡构造函数初始化std::对象数组,c++,stdarray,C++,Stdarray,我有一个类定义为 类边缘线 { 私人: const int e_size; //其他私人成员。。。 公众: //构造器 显式Edgelet(int size,Color cl1=Color::NA,Color cl2=Color::NA); //其他公众成员。。。 由于类中有一个const成员,编译器会隐式删除默认的复制构造函数。需要给它一个参数进行初始化 问题在课堂上出现 类多维数据集 { 私人: std::阵列c_边元素; //其他成员。。。 公众: //构造器 多维数据集(整数大小) /

我有一个类定义为

类边缘线
{
私人:
const int e_size;
//其他私人成员。。。
公众:
//构造器
显式Edgelet(int size,Color cl1=Color::NA,Color cl2=Color::NA);
//其他公众成员。。。
由于类中有一个const成员,编译器会隐式删除默认的复制构造函数。需要给它一个参数进行初始化

问题在课堂上出现

类多维数据集
{
私人:
std::阵列c_边元素;
//其他成员。。。
公众:
//构造器
多维数据集(整数大小)
//其他公众成员。。。
此类包含以前类对象的std::数组。如何初始化此数组?需要为std::数组的每个元素指定size参数以进行初始化。我想将std::数组的每个元素设置为
Edgelet(size-2)

当然,我可以使用初始值设定项列表,但由于构造函数中有12个元素和其他参数,代码变得越来越难看。此外,我使用6个元素而不是12个元素的类似情况也这样做了


我还尝试为参数提供默认值,但由于有一个常量成员,该值以后无法更改。我还尝试查看std::initializer_列表,但似乎您无法向其中添加新元素(或者您可以??)。是否有一种有效的方法来执行此操作?

如果数组成员不是默认可构造的,则必须为每个元素提供一个initiailzer。您可以使用
std::vector
而不是
std::array
std::vector
的构造函数的形式为

constexpr vector( size_type count,
                  const T& value,
                  const Allocator& alloc = Allocator());
                  
这将构造用
值初始化的
count
对象。这将使您的代码看起来像

class Cube
{
private:
    std::vector<Edgelet> c_edgelets;
    //Other members...
public:
    //The constructor
    Cube(int size) : c_edgelets(12, Edgelet(size - 2)) {}
    
    //Other public members...
};
类多维数据集
{
私人:
std::向量c_边元素;
//其他成员。。。
公众:
//构造器
立方体(整数大小):c_Edgelet(12,Edgelet(大小-2)){}
//其他公众成员。。。
};

您可以编写帮助器类:

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>());
}
模板
std::数组生成\数组执行(常量T&def,std::索引\序列)
{
返回{(Is,void(),def)..};
}
模板
std::数组生成_数组(常量T&def)
{
返回make_array_impl(def,std::make_index_sequence());
}
然后

Cube(int size) : c_edgelets(make_array<12>(Edgelet(size - 2)) {}
Cube(int-size):c_edgelets(生成数组(Edgelet(size-2)){

有什么方法可以使用std::array实现吗?由于大小是编译时常量,因此使用std::array比使用std::vector更自然。@Jatin Jarod42刚刚发布了一个使用std::array实现这一点的方法。
。根据Edgelet构造函数中发生的情况,它也可能是一个用例,可能需要在适当的位置构造它我还没有研究C++的模板,但我似乎别无选择,只能先学习它们来实现这一点。无论如何,谢谢你的答案。