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