初始化非默认可构造元素的 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?

std::array 默认初始化还是值初始化?

非默认可构造元素的最后一个元素

如何使用初始化列表构造 std::array 对象? [复制]

具有引用数据成员的类的默认构造函数?

初始化 std::array 的 std::array