#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;
}