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

时间:2016-03-26 18:41:08

标签: c++ c++11 stl aggregate-initialization

#include <iostream> using namespace std; class Rectangle { public: Rectangle(double length, double height) { if (length > 0 and heigth > 0) { length_ = length; height_ = height; } else { // Throw an exception ? Use a convention ? } } // other methods private: double length_; double height_; }; int main() { // do stuff return 0; } 的{​​{3}},我们发现它可以按照以下方式进行初始化(使用聚合初始化):

std::array

无论如何,在这种情况下会出现问题:

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

如何在构建template<int N> struct S { S(): arr{/*??*/} { } std::array<int,N> arr; }; 时初始化数组(例如,使用从s0的值或使用N-1 ed函数向其传递索引)?

1 个答案:

答案 0 :(得分:4)

看到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...}
    { }
};