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

Call user defined constructor on elements in std::array

本文关键字:用户 定义 构造函数 调用 元素 array std      更新时间:2023-10-16

我有一个简单的例子,我创建了一些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;

当我在构造函数m_bar(bar)中使用初始化器列表时,这将所有Foo.m_bar设置为0(因为这是默认的构造函数参数值)。如果我不这样做,那么它就充满了垃圾值。

我的问题是,我如何在不知道数组大小之前传递另一个值不同于默认值到数组中每个元素的构造函数?

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

您应该简单地默认构造std::array,然后使用它的fill方法用固定值填充它。许多编译器可以有效地优化这一点,因此您不必为"额外的"初始化付出代价。

为了满足您的用例,代码看起来像这样:

fooArr.fill(Foo(3));

制作包含N个元素的integer_sequence,并使用包扩展构建数组。如果你的默认构造函数做的是很重要的工作,或者它不存在,这将更有用。

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::array<Foo, num> fooArr = make_repeating_array<num>(Foo(5));