【问题标题】:Call user defined constructor on elements in std::array在 std::array 中的元素上调用用户定义的构造函数
【发布时间】:2015-12-14 02:51:51
【问题描述】:

我有一个简单的例子,我创建了一些 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(因为这是默认构造函数参数值)。如果我不这样做,那么它就会充满垃圾值。

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

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

【问题讨论】:

  • fooArr{{1,2,3,4,5}} 怎么样?
  • 对不起,不是很清楚,但我不应该事先知道数组大小,才能做到这一点。我已经相应地编辑了问题。
  • 在 Cppreference 中有这个例子: std::array<:string> a3 = { std::string("a"), "b" };是你要找的吗?
  • 你知道编译时的大小还是由预处理器定义的?
  • std::array&lt;Foo, 5&gt; 和“不知道数组大小”让事情变得不清楚。

标签: c++ arrays c++11 initialization stdarray


【解决方案1】:

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

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

fooArr.fill(Foo(3));

【讨论】:

  • 这个问题(除非我误解了你的意思)是,如果我在 Foo() 的构造函数中有代码,它取决于大小的值,它仍然会得到 0,不是吗?跨度>
  • 我什至会把它包装在一个方便的函数中,以便在初始化时使用它。
  • @G.Rassovsky size 是什么,Foo 是如何知道的?
  • arrrgh,我的意思是说 bar 而不是 size,对不起。
  • 你会做fooArr.fill(Foo(3)) 来满足你的榜样。 bar 将是匿名临时 Foo 中的 3,然后将复制到所有数组元素。
【解决方案2】:

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

【讨论】:

  • 我很欣赏这个例子,尽管我不确定它是如何工作的。我已经接受了 John Zwinck 的回答,因为它更简单并且适用于我的情况,但请继续保持,因为我可以想象这在更复杂的情况下会更有用。
  • (void(Ns), value) 是干什么用的?
  • @xtofl 本质上,它重复了valuesizeof...(Ns)(即N)次。 , 是逗号运算符。
猜你喜欢
  • 2011-05-19
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多