Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中的元素调用用户定义的构造函数_C++_Arrays_C++11_Initialization_Stdarray - Fatal编程技术网

C++ 对std::array中的元素调用用户定义的构造函数

C++ 对std::array中的元素调用用户定义的构造函数,c++,arrays,c++11,initialization,stdarray,C++,Arrays,C++11,Initialization,Stdarray,我有一个简单的例子,其中我创建了一个包含一些Foo元素的std::array: struct Foo { Foo(int bar=0) : m_bar(bar) { // Code depending on the value of bar } int m_bar; }; const unsigned int num = // get array size std::array<Foo, num> fooArr; str

我有一个简单的例子,其中我创建了一个包含一些Foo元素的
std::array

struct Foo
{
     Foo(int bar=0) : m_bar(bar) 
     {
       // Code depending on the value of bar
     }

     int m_bar;
};

const unsigned int num = // get array size 
std::array<Foo, num> fooArr;
structfoo
{
Foo(int bar=0):m_bar(bar)
{
//代码取决于条形图的值
}
国际酒吧;
};
const unsigned int num=//获取数组大小
std::数组fooArr;
当我在构造函数
m_-bar(bar)
中使用初始化器列表时,这会将所有
Foo.m_-bar
设置为
0
(因为这是默认的构造函数参数值)。如果我不这样做,那么它就充满了垃圾值

我的问题是,在不知道数组大小的情况下,如何将另一个不同于默认值的值传递给数组中每个元素的构造函数


我尝试在创建数组时使用init列表,例如:
std::array fooArr{3}
,但这只会将第一个元素的
m_bar
设置为
3

,您只需默认构造
std::array
,然后使用其方法填充一个固定值。许多编译器可以有效地对此进行优化,因此您无需支付“额外”初始化费用

为了满足您的用例,代码如下所示:

fooArr.fill(Foo(3));

使用N个元素创建一个
整数\u序列
,并使用包扩展构建阵列。如果您的默认构造函数做了非平凡的工作或不存在,这将更有用

template<std::size_t N, class T, std::size_t... Ns>
std::array<T, N> make_repeating_array(const T& value, std::index_sequence<Ns...>) {
    return {(void(Ns), value)... };
}

template<std::size_t N, class T>
std::array<T, N> make_repeating_array(const T& value) {
    return make_repeating_array<N>(value, std::make_index_sequence<N>());
}
模板
std::数组生成重复数组(常量T和值,std::索引序列){
返回{(void(Ns),value)…};
}
模板
std::数组生成重复数组(常量T和值){
返回make_repeating_数组(值,std::make_index_sequence());
}
用作

std::array<Foo, num> fooArr = make_repeating_array<num>(Foo(5));
std::array fooArr=make_repeating_array(Foo(5));

fooArr{{1,2,3,4,5}}怎么样?很抱歉,不太清楚,但我不应该知道数组大小,因为我无法做到这一点。我已经相应地编辑了这个问题;这是您正在搜索的吗?您知道编译时的大小还是由预处理器定义的?
std::array
和“不知道数组大小”使事情变得不清楚。问题是(除非我误解了您的意思)如果我在Foo()的构造函数中有代码这取决于大小的值,它仍然会得到0,不是吗?我甚至会将它封装在一个方便的函数中,以便在初始化时使用它。@G.Rassovsky什么是
size
,以及
Foo
如何知道它?啊,我的错,我想说的是bar而不是size,对不起。你会做
fooArr.fill(Foo(3))
以满足您的示例
bar
将是匿名临时
Foo
中的
3
,然后将其复制到所有数组元素。我很欣赏这个示例,尽管我不确定它是如何工作的。我接受了John Zwinck的答案,因为它更简单,也适用于我的情况,但请继续你的答案,因为我可以想象这在更复杂的情况下更有用。什么是
(void(Ns),value)
?@xtofl本质上,它重复
value
sizeof…(Ns)
(即
N
)次。
是逗号运算符。