#include <array>
#include <initializer_list>
#include <iostream>
#include <iterator>
template <typename T, size_t N>
struct Array
{
public:
Array() = default;
Array(std::initializer_list<T> init) : Array(init, std::make_index_sequence<N>()) {}
auto begin() const { return std::begin(data); }
auto end() const { return std::end(data); }
private:
template <size_t...I>
Array(std::initializer_list<T> init, std::index_sequence<I...>, T def_value = T())
: data {get<I>(init, def_value)...} { }
template <size_t I>
static const T& get(const std::initializer_list<T>& init, const T& def_value) {
return I < init.size() ? init.begin()[I] : def_value;
}
private:
std::array<T,N> data;
// T data[N];
};
template <typename T, size_t N>
std::ostream& operator << (std::ostream& output, const Array<T, N>& array)
{
output << "[";
for (auto&& element : array)
output << " " << element;
return output << " ]";
}
int main()
{
Array<Array<int, 3>, 3> m { {0, 1}, {2, 3} };
std::cout << m << std::endl;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CnN0cnVjdCBBcnJheQp7CnB1YmxpYzoKCiAgIEFycmF5KCkgPSBkZWZhdWx0OwogICBBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaW5pdCkgOiBBcnJheShpbml0LCBzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8Tj4oKSkge30KCiAgIGF1dG8gYmVnaW4oKSBjb25zdCB7IHJldHVybiBzdGQ6OmJlZ2luKGRhdGEpOyB9CiAgIGF1dG8gZW5kKCkgY29uc3QgeyByZXR1cm4gc3RkOjplbmQoZGF0YSk7IH0KCnByaXZhdGU6CiAgIHRlbXBsYXRlIDxzaXplX3QuLi5JPgogICBBcnJheShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gaW5pdCwgc3RkOjppbmRleF9zZXF1ZW5jZTxJLi4uPiwgVCBkZWZfdmFsdWUgPSBUKCkpCiAgICAgIDogZGF0YSB7Z2V0PEk+KGluaXQsIGRlZl92YWx1ZSkuLi59IHsgfQoKICAgdGVtcGxhdGUgPHNpemVfdCBJPgogICBzdGF0aWMgY29uc3QgVCYgZ2V0KGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiYgaW5pdCwgY29uc3QgVCYgZGVmX3ZhbHVlKSB7CiAgICAgIHJldHVybiBJIDwgaW5pdC5zaXplKCkgPyBpbml0LmJlZ2luKClbSV0gOiBkZWZfdmFsdWU7CiAgIH0KCnByaXZhdGU6CiAgIHN0ZDo6YXJyYXk8VCxOPiBkYXRhOwogICAvLyBUIGRhdGFbTl07Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKHN0ZDo6b3N0cmVhbSYgb3V0cHV0LCBjb25zdCBBcnJheTxULCBOPiYgYXJyYXkpCnsKICAgb3V0cHV0IDw8ICJbIjsKICAgZm9yIChhdXRvJiYgZWxlbWVudCA6IGFycmF5KQogICAgICBvdXRwdXQgPDwgIiAiIDw8IGVsZW1lbnQ7CgogICByZXR1cm4gb3V0cHV0IDw8ICIgXSI7Cn0KCmludCBtYWluKCkKewogICBBcnJheTxBcnJheTxpbnQsIDM+LCAzPiBtIHsgezAsIDF9LCB7MiwgM30gfTsKICAgc3RkOjpjb3V0IDw8IG0gPDwgc3RkOjplbmRsOwp9Cgo=