std::array 聚合初始化和模板整数类型
std::array aggregate initialization and template integral types
从std::array
的documentation中我们发现可以这样初始化(使用聚合初始化):
struct S {
S(): arr{0,1} { }
std::array<int,2> arr;
};
反正这种情况下就出现了问题:
template<int N>
struct S {
S(): arr{/*??*/} { }
std::array<int,N> arr;
};
如何在构造 s
时初始化数组(例如,值从 0
到 N-1
或使用要传递给的 constexpr
ed 函数索引)?
看看 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...}
{ }
};
从std::array
的documentation中我们发现可以这样初始化(使用聚合初始化):
struct S {
S(): arr{0,1} { }
std::array<int,2> arr;
};
反正这种情况下就出现了问题:
template<int N>
struct S {
S(): arr{/*??*/} { }
std::array<int,N> arr;
};
如何在构造 s
时初始化数组(例如,值从 0
到 N-1
或使用要传递给的 constexpr
ed 函数索引)?
看看 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...}
{ }
};