从#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;
};
时初始化数组(例如,使用从s
到0
的值或使用N-1
ed函数向其传递索引)?
答案 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...}
{ }
};