C++ 如何初始化大尺寸的std::array

C++ 如何初始化大尺寸的std::array,c++,C++,我有一个类,这个类包含一个大尺寸的std::array,如何初始化数组 参见课堂测试 样本: class context{......} class value { public: value(context& ctx) : ctx_(ctx){ } protected: context& ctx_; int data_ = 0; } class test { public: test() : /*i need to initia

我有一个类,这个类包含一个大尺寸的std::array,如何初始化数组

参见课堂测试

样本:

class context{......}

class value
{
public:
    value(context& ctx) : ctx_(ctx){
    }

protected:
    context& ctx_;

    int data_ = 0;
}


class test
{
public:
    test() : /*i need to initialize values at here*/ values_{ctx_,.....}
    {
    }

protected:
    context ctx_;
    std::array<value_t,10000> values_;
}
我不需要像上面这样尴尬的回答

是否有一种方法可以使用简单的代码(如折叠表达式)初始化std::array???

您可以在数组上使用fill()方法:

您可以在阵列上使用fill()方法:

您可以委托给接受参数包的构造函数,然后将其折叠起来:

#包括
#包括
课堂测试
{
公众:
test():test(std::make_index_sequence{}){
私人:
模板
测试(std::index_序列):值{{(I,ctx)..}{}
受保护的:
上下文ctx;
std::数组值;
};
尽管对我来说,这绝对会在除
-O0
之外的任何优化级别上消耗编译时间(并且可能会增大编译代码的大小)

您也可以尝试构造到未初始化的内存中,这样就不需要默认构造:

#包括
#包括
#包括
#包括
课堂测试
{
公众:
测试(){
std::byte*p=值\内存\uu;
对于(std::byte*end=std::end(值内存);p

这将有一些运行时成本,并且您必须丢失
std::array
(除非您选择
std::array
,在这种情况下,您必须清洗数组的每个元素)

您可以委托给接受参数包的构造函数,然后将其折叠起来:

#包括
#包括
课堂测试
{
公众:
test():test(std::make_index_sequence{}){
私人:
模板
测试(std::index_序列):值{{(I,ctx)..}{}
受保护的:
上下文ctx;
std::数组值;
};
尽管对我来说,这绝对会在除
-O0
之外的任何优化级别上消耗编译时间(并且可能会增大编译代码的大小)

您也可以尝试构造到未初始化的内存中,这样就不需要默认构造:

#包括
#包括
#包括
#包括
课堂测试
{
公众:
测试(){
std::byte*p=值\内存\uu;
对于(std::byte*end=std::end(值内存);p

这将有一些运行时成本,并且您必须丢失
std::array
(除非您选择
std::array
,在这种情况下,您必须清洗数组中的每个元素)

问题是数组中包含的元素类型没有默认构造函数,因此,当您声明一个保存该类型的
std::array
时,只能使用初始化数组,以便您可以显式地将值传递给每个元素的构造函数。当数组是类或结构的成员时,该初始化需要使用类/结构的构造函数。这正是你想要避免的

要解决此问题,可以使用显式地在循环中分别构造每个数组元素:

#包括
类上下文{……}
阶级价值
{
公众:
值(上下文和ctx):ctx(ctx){
}
受保护的:
上下文&ctx;
int数据=0;
}
课堂测试
{
公众:
测试()
{
用于(自动和验证:值)
新的(&v)值(ctx_);
}
~test()
{
用于(自动和验证:值){
//注意:在C++17及更高版本中需要std::launder
//标准::流槽(重新解释铸造(&v))->~value();
重新解释强制转换(&v)->~value();
}
}
受保护的:
上下文ctx;
使用storage\u type=std::aligned\u storage::type;
std::数组值;
//访问对齐存储中的对象
值和运算符[](标准::大小\u t位置)
{
//注意:在C++17及更高版本中需要std::launder
//return*std::流槽(重新解释铸件(&value[pos]);
return*重新解释铸件(&value[pos]);
}
};

问题在于数组中包含的元素的类型没有默认构造函数,因此当您声明包含该类型的
std::array
时,只能使用初始化数组,以便可以显式地将值传递给每个元素的构造函数。当数组是类或结构的成员时,该初始化需要使用类/结构的构造函数。这正是你想要避免的

为了解决这个问题,可以使用显式地在loo中分别构造每个数组元素
test() : values_{ctx_,ctx_,ctx_,ctx_,ctx_}
{
}