#include <iostream>
#include <sstream>
using namespace std;

template <int N> struct Array : Array <N - 1>
{
    double x;
    
    template<int M> double& comp() { return Array<M>::x; }
    template<int M> const double& comp() const { return Array<M>::x; }
    
    //Prints vector
    ostream& print(ostream& out) const
    {
        static_cast<const Array<N-1>*>(this)->print(out);
        out << ", " <<x;
        return out;
    }
    
    double& operator[] (int i) {
    	return reinterpret_cast<double*>(this)[i];
	}

    
    //Vector in place summation, without looping
    Array& operator+=(const Array& v)
    {
        x+=v.x;
        *static_cast<Array<N-1>*>(this) += static_cast<const Array<N-1>&>(v);
        return *this;
    }
};

template <> struct Array<1>
{
    double x;
    
    template<int M> double& comp() { return Array<M>::x; }
    template<int M> const double& comp() const { return Array<M>::x; }
    
    //Prints vector
    ostream& print(ostream& out) const
    {
        out << x;
        return out;
    }
    
    double& operator[](int i) {
    	return *reinterpret_cast<double*>(this); 
	}
    
    //Vector in place summation, without looping
    Array& operator+=(const Array& v)
    {
        x+=v.x;
        return *this;
    }
};

template<int N>
ostream& operator<<(ostream& out, const Array<N>& v)
{
    out << "("; v.print(out); out << ")";
    return out;
}

int main() {
	Array<3> vec;
	
	vec[0] = 1; vec[1] = 2; vec[2] = 3;
	
	cout << vec << endl;
	
	cout << (vec+=vec) << endl;
	
	return 0;
}