Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::array作为字段的语法是什么,其中的对象必须使用接受参数的ctor构造? 类栏 { 巴(var1 v1,var2 v2) { //设置栏字段 } //条形字段 } 福班 { Foo() : mArray();//这部分怎么做 { } std::阵列mArray; }_C++_C++11_Stdarray - Fatal编程技术网

C++ std::array作为字段的语法是什么,其中的对象必须使用接受参数的ctor构造? 类栏 { 巴(var1 v1,var2 v2) { //设置栏字段 } //条形字段 } 福班 { Foo() : mArray();//这部分怎么做 { } std::阵列mArray; }

C++ std::array作为字段的语法是什么,其中的对象必须使用接受参数的ctor构造? 类栏 { 巴(var1 v1,var2 v2) { //设置栏字段 } //条形字段 } 福班 { Foo() : mArray();//这部分怎么做 { } std::阵列mArray; },c++,c++11,stdarray,C++,C++11,Stdarray,我需要使用bar提供的接受一些参数的ctor来构造这个数组,如果它们都被构造成相同的值就可以了,因为稍后我会给它们分配适当的值,我只需要初始化它。我在谷歌上搜索过它,并尝试了许多不同的语法,但由于某些原因我无法正确使用。问题是Bar没有默认构造函数,因此std::array也没有默认构造函数 如果将默认构造函数添加到Bar,std::array也将有一个构造函数: class Bar { Bar( var1 v1, var2 v2 ) { // setup Bar fields

我需要使用bar提供的接受一些参数的ctor来构造这个数组,如果它们都被构造成相同的值就可以了,因为稍后我会给它们分配适当的值,我只需要初始化它。我在谷歌上搜索过它,并尝试了许多不同的语法,但由于某些原因我无法正确使用。

问题是
Bar
没有默认构造函数,因此
std::array
也没有默认构造函数

如果将默认构造函数添加到
Bar
std::array
也将有一个构造函数:

class Bar
{
Bar( var1 v1, var2 v2 )
    {
    // setup Bar fields
    }
// bar fields
}    

class Foo
{
Foo()
    :
    mArray();// how to do this part
    {

    }
std::array<Bar, 800> mArray;
}
#包括
使用名称空间std;
typedef int var1、var2;
分类栏
{
公众:

Bar(){}/问题是
Bar
没有默认构造函数,因此
std::array
也没有默认构造函数

如果将默认构造函数添加到
Bar
std::array
也将有一个构造函数:

class Bar
{
Bar( var1 v1, var2 v2 )
    {
    // setup Bar fields
    }
// bar fields
}    

class Foo
{
Foo()
    :
    mArray();// how to do this part
    {

    }
std::array<Bar, 800> mArray;
}
#包括
使用名称空间std;
typedef int var1、var2;
分类栏
{
公众:
Bar(){}//
…它可能包含打字错误(在电话中),您必须编写
make_bar
,但它会为您创建800条的数组。它的核心是制作一个800元素的参数包,然后将其解压缩以生成一个800元素的构造函数

可选地向
添加默认的ctor

修改它以获取单个
并复制800份也不难:您只需将
传递到最终函数,然后使用它来生成新元素

…它可能包含打字错误(在电话中),您必须编写
make_bar
,但它会为您创建800条的数组。它的核心是制作一个800元素的参数包,然后将其解压缩以生成一个800元素的构造函数

可选地向
添加默认的ctor



修改它以获取单个
并复制800个副本也不难:您只需将
传递给最终函数,然后使用它生成新元素。

这是一个固定的数组大小,因为我知道编译时需要的对象数。使用初始值设定项列表可能会(因为我自己还没有使用过)这样做:这是一个固定的数组大小,因为我知道编译时需要的对象数。使用初始值设定项列表可能会(因为我自己还没有使用过)这样做:我需要为初始值设定项列表写出800个bar-ctor吗?如果bar没有默认值(空参数),它将不会编译 ctor@EddieV223:我刚刚注意到Bar没有默认构造函数。这就是问题所在。为什么我们不能像array(Bar(arg,arg2,arg2))那样做呢?将所有条设置为与我发送的条相等。@EddieV223:因为
std::array
不提供这样的构造函数,因为它是聚合类型。我建议使用
std::vector
,它确实有这样的构造函数。
std::array
是almos中性能关键代码的一种特殊类型t所有情况下
std::vector
都是一个更好的选择。是否希望我为初始值设定项列表写出800个条形图?如果条形图没有默认值(空参数),它将不会编译ctor@EddieV223:我刚刚注意到Bar没有默认构造函数。这就是问题所在。为什么我们不能像array(Bar(arg,arg2,arg2))那样做呢?将所有条设置为与我发送的条相等。@EddieV223:因为
std::array
不提供这样的构造函数,因为它是聚合类型。我建议使用
std::vector
,它确实有这样的构造函数。
std::array
是almos中性能关键代码的一种特殊类型并非所有情况下,
std::vector
都是一个更好的选择。实际上,这不起作用,因为它将超过大多数编译器的递归模板实例化限制。如果确实要这样做,则需要使用对数深度模式。@user1131467在800时,它不会打破C++11的推荐递归限制(即900)。我决定保持简单,因为它足够小!实际上,建议的限制是1024而不是900,但出于某种原因,gccs默认值是512。不知道clang或msvc。实际上,这不起作用,因为它将超过大多数编译器的递归模板实例化限制。如果确实想这样做,则需要使用对数深度模式为。@user1131467在800时,它不会打破C++11的建议递归限制(900)。我决定保持它的简单性,因为它足够小!实际上建议的限制是1024而不是900,但出于某种原因,gccs默认值是512。不知道clang或msvc。
template<unsigned...>struct seq {};
template<unsigned max, unsigned... s>struct make_seq:make_seq<max-1,max-1,s...>{};
template<unsigned...s>struct make_seq<0,s...>:seq<s...>{};
 template<unsigned N> Bar make_bar();
 template<unsigned N,unsigned...s>
 std::array<Bar,N> make_array_helper( seq<s...> ){
   return { make_bar<s>()... };
 }
 template<unsigned N>
 std::array<Bar,N> make_array(){
   return make_array_helper( make_seq<N>() );
 }