编译期间的 std::array 类成员集?

Posted

技术标签:

【中文标题】编译期间的 std::array 类成员集?【英文标题】:std::array class member set during compile time? 【发布时间】:2016-07-13 10:09:57 【问题描述】:

我有一个带有私有成员 std::array<int,10> m_arr; 的类,默认情况下它包含零,但在一种情况下,它必须设置为其他值。 该类有一个设置器

void setArray(const std::array<int,10>& arr)

    m_arr=arr;

但是我想知道是否可以在特定情况下以某种方式在编译时完成设置? 提前致谢。

【问题讨论】:

这取决于该用例的确切区别? 在编译时知道const std::array&lt;int,10&gt;&amp; arr 参数应该是可能的。如果是用户输入等,这是不可能的 在那种情况下,所有的值都需要不是 0 还是它们会有不同的值? const std::array&lt;int,10&gt;&amp; arr 在编译时是已知的,而不是用户输入,并且值为零。 你需要constexpr,而不仅仅是const 【参考方案1】:

可能的解决方案如下:

#include<utility>
#include<array>

struct S 
    constexpr S(): arr  

    template<std::size_t... I>
    constexpr S(std::integer_sequence<std::size_t, I...>): arr I...   

    std::array<std::size_t, 10> arr;
;

int main() 
    constexpr S s1;
    constexpr S s2std::integer_sequence<std::size_t, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1>;
    // equivalent to: constexpr S s3std::integer_sequence<std::size_t, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>;
    constexpr S s3std::make_index_sequence<10>;

请注意,integer_sequence 是 C++14 修订版的一部分。 无论如何,您可以在网上找到适合基于 C++11 的项目的这种结构的实现。

【讨论】:

以上是关于编译期间的 std::array 类成员集?的主要内容,如果未能解决你的问题,请参考以下文章

如何静态断言 std::array 成员的大小

C ++初始化对象的非静态成员数组

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

指向 std::array 成员的指针

类成员的编译顺序之嵌套类型对类的影响

如何通过构造函数调整私有 std::array 成员的大小?