【问题标题】:std::array class member set during compile time?编译期间的 std::array 类成员集?
【发布时间】: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

标签: c++ templates c++11


【解决方案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 的项目的这种结构的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多