#include #include // for min() #include using namespace std; template class mathvector { public: explicit mathvector(array const& values) : content_(values) {} mathvector() : content_{} {} // zero-initialize // -------------------------------------------------- mathvector& operator*=(Type scalar) { for (auto& el : content_) el *= scalar; return *this; } // -------------------------------------------------- mathvector& operator+=(mathvector const& other) { for (size_t i(0); i < Dim; ++i) content_[i] += other.content_[i]; return *this; } // -------------------------------------------------- template mathvector convert() const { array newbie{}; constexpr size_t borne(min(Dim, Dim2)); for (size_t i(0); i < borne; ++i) newbie[i] = content_[i]; return mathvector(newbie); // return newbie; // only possible with non-explicit constructor } // -------------------------------------------------- void display(ostream& out) const { out << '('; if (Dim > 0) { constexpr size_t last(Dim - 1); for (size_t i(0); i < last; ++i) out << content_[i] << ", "; out << content_[last]; } out << ')'; } // -------------------------------------------------- private: array content_; }; // ====================================================================== template mathvector operator*(Type const& scalar, mathvector vect) { return vect *= scalar; } // ====================================================================== template mathvector operator+(mathvector vect1, mathvector const& vect2) { return vect1 += vect2; } // ====================================================================== template ostream& operator<<(ostream& out, mathvector const& vect) { vect.display(out); return out; } // ====================================================================== int main() { mathvector<2> v1({3.4, 4.5}); mathvector<4, int> v2({3, 4, 5, 6}); // implicit instantiation cannot work here mathvector<3, int> v3(v2.convert<3>()); mathvector<4, double> v4(v1.convert<4>()); cout << v1 << endl; cout << v2 << endl; cout << v3 << endl; cout << v4 << endl; cout << -2 * v2 << endl; cout << v3 + v3 << endl; return 0; }