#include <iostream>
#include <array>
#include <initializer_list>
#include <algorithm>
using std::cout;
using std::cin;
using std::endl;
/*
* T = Type
* S = Size
*/
template<typename T, size_t S>
class Array {
public:
using value_type = T;
using size_type = size_t;
using different_type = ptrdiff_t;
using pointer = T*;
using const_pointer = const T*;
using reference = T&;
using const_reference = const T&;
constexpr int Size() const { return S; }
reference operator[](size_t index) { return m_Data[index]; }
const_reference operator[](size_t index) const { return m_Data[index]; }
Array(std::initializer_list<T> args)
{
std::copy_n(args.begin(), std::min(args.size(), S), std::begin(m_Data));
if (args.size() < S)
std::fill_n(std::begin(m_Data)+args.size(), S-args.size(), T{});
}
private:
T m_Data[S];
};
int main()
{
// My array
Array<int, 10> arr = { 32, 45, 12 };
for (int i = 0; i < arr.Size(); ++i) {
cout << arr[i] << ' ';
}
cout << endl;
// std::array used as reference
std::array<int, 10> test = { 32, 45, 12, 53 };
for(auto val : test) {
cout << val << ' ';
}
cin.get();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmNpbjsKdXNpbmcgc3RkOjplbmRsOwoKLyoKICogVCA9IFR5cGUKICogUyA9IFNpemUKICovCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTPgpjbGFzcyBBcnJheSB7CnB1YmxpYzoKICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOwogICAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OwogICAgdXNpbmcgZGlmZmVyZW50X3R5cGUgPSBwdHJkaWZmX3Q7CiAgICB1c2luZyBwb2ludGVyID0gVCo7CiAgICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCo7CiAgICB1c2luZyByZWZlcmVuY2UgPSBUJjsKICAgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IFQmOwoKICAgIGNvbnN0ZXhwciBpbnQgU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFM7IH0KCiAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIHsgcmV0dXJuIG1fRGF0YVtpbmRleF07IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9EYXRhW2luZGV4XTsgfQoKCUFycmF5KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBhcmdzKQoJewoJICAgIHN0ZDo6Y29weV9uKGFyZ3MuYmVnaW4oKSwgc3RkOjptaW4oYXJncy5zaXplKCksIFMpLCBzdGQ6OmJlZ2luKG1fRGF0YSkpOwoJCWlmIChhcmdzLnNpemUoKSA8IFMpCgkgICAgCXN0ZDo6ZmlsbF9uKHN0ZDo6YmVnaW4obV9EYXRhKSthcmdzLnNpemUoKSwgUy1hcmdzLnNpemUoKSwgVHt9KTsKCX0KCnByaXZhdGU6CiAgICBUIG1fRGF0YVtTXTsKfTsKCmludCBtYWluKCkKewogICAgLy8gTXkgYXJyYXkKICAgIEFycmF5PGludCwgMTA+IGFyciA9IHsgMzIsIDQ1LCAxMiB9OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIuU2l6ZSgpOyArK2kpIHsKCQljb3V0IDw8IGFycltpXSA8PCAnICc7Cgl9CgoJY291dCA8PCBlbmRsOwoKICAgIC8vIHN0ZDo6YXJyYXkgdXNlZCBhcyByZWZlcmVuY2UKICAgIHN0ZDo6YXJyYXk8aW50LCAxMD4gdGVzdCA9IHsgMzIsIDQ1LCAxMiwgNTMgfTsKCWZvcihhdXRvIHZhbCA6IHRlc3QpIHsKCQljb3V0IDw8IHZhbCA8PCAnICc7Cgl9CgkKICAgIGNpbi5nZXQoKTsKICAgIHJldHVybiAwOwp9