初始化非默认可构造元素的 std::array?
Posted
技术标签:
【中文标题】初始化非默认可构造元素的 std::array?【英文标题】:Initializing an std::array of non-default-constructible elements? 【发布时间】:2017-10-23 22:58:47 【问题描述】:假设使用命名构造函数make_foo()
键入foo_t
。现在,我想要正好有 123 个 foo ——不多也不少。所以,我正在考虑std::array<foo_t, 123>
。现在,如果foo_t
是默认可构造的,我会写:
std::array<foo_t, 123> pity_the_foos;
std::generate(
std::begin(pity_the_foos), std::end(pity_the_foos),
[]() return make_foo();
);
Bob 是我的叔叔,对吧?不幸的是...foo_t
没有默认 ctor。
那么我应该如何初始化我的数组呢?我是否需要使用一些可变参数模板扩展巫术?
注意:如果有帮助,答案可以使用 C++11、C++14 或 C++17 中的任何内容。
【问题讨论】:
这会有帮助吗? ***.com/a/19016627/8414561 @DevNull:是的,但是 - 你那里的数组生成器 sn-p 有多惯用? 定义“惯用语”? :) @DevNull:有一个标签……大多数人使用的成语; “常见的,适当的事情”。另外 - 看起来它需要一些修复才能使用 C++14 整数序列,对吗? 嗯,答案表明它似乎很地道 【参考方案1】:平常。
template<size_t...Is>
std::array<foo_t, sizeof...(Is)> make_foos(std::index_sequence<Is...>)
return ((void)Is, make_foo())... ;
template<size_t N>
std::array<foo_t, N> make_foos()
return make_foos(std::make_index_sequence<N>());
【讨论】:
那个索引序列确实会不断弹出,不是吗...虽然,真的,在我的情况下,我什至不需要整数序列,只要任何长度为 N 的元组。以上是关于初始化非默认可构造元素的 std::array?的主要内容,如果未能解决你的问题,请参考以下文章
编译器生成的默认构造函数是否会将std :: array中的指针初始化为nullptr?