在编译期间设置std :: array类成员?

时间:2016-07-13 10:09:58

标签: c++ templates c++11

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

void setArray(const std::array<int,10>& arr)
{
    m_arr=arr;
}

但是我想知道这个设置是否可以针对特定情况以某种方式完成编译时间? 提前谢谢。

1 个答案:

答案 0 :(得分: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 s2{std::integer_sequence<std::size_t, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1>{}};
    // equivalent to: constexpr S s3{std::integer_sequence<std::size_t, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{}};
    constexpr S s3{std::make_index_sequence<10>{}};
}

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