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

时间:2015-09-17 09:28:26

标签: 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;

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

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

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

2 个答案:

答案 0 :(得分:6)

您应该只是默认构造std::array,然后使用其fill方法用固定值填充它。许多编译器可以有效地优化它,因此您不会为“额外”初始化付费。

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

fooArr.fill(Foo(3));

答案 1 :(得分: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));