std::array 聚合初始化和模板整数类型

std::array aggregate initialization and template integral types

std::arraydocumentation中我们发现可以这样初始化(使用聚合初始化):

struct S {
    S(): arr{0,1} { }
    std::array<int,2> arr;
};

反正这种情况下就出现了问题:

template<int N>
struct S {
    S(): arr{/*??*/} { }
    std::array<int,N> arr;
};

如何在构造 s 时初始化数组(例如,值从 0N-1 或使用要传递给的 constexpred 函数索引)?

看看 std::iota 的大量未充分利用的力量:

template <int N>
struct S {
    S() {
        std::iota(arr.begin(), arr.end(), 0);
    }

    std::array<int, N> arr;
};

虽然如果你真的想使用聚合初始化,总是有 std::integer_sequence(需要 C++14,但在 SO 上有很多 C++11 解决方案):

template <int N>
struct S {
    S() : S(std::make_integer_sequence<int, N>{}) {}

    std::array<int, N> arr;
private:
    template <int... Is>
    S(std::integer_sequence<int, Is...> )
        : arr{Is...}
    { }
};