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