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

Call user defined constructor on elements in std::array

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

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(因为这是默认的构造函数参数值)。如果我不这样做,那么它就会充满垃圾值。

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

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

您应该简单地默认构造 std::array 然后使用它的 fill 方法用固定值填充它。许多编译器可以有效地对此进行优化,因此您无需为 "extra" 初始化付费。

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

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));