#include #include #include template class Vector { public: template Vector(U const& expression) { for (std::size_t i {0}; i < dim; ++i) { data[i] = expression[i]; } } template Vector(std::initializer_list list) : data { } { std::copy(list.begin(), list.end(), data.begin()); } T operator[](std::size_t i) const { return data[i]; } T& operator[](std::size_t i) { return data[i]; } private: std::array data { }; }; template class Vector_Sum { public: Vector_Sum(LHS const& lhs, RHS const& rhs) : lhs{lhs}, rhs{rhs} { } auto operator[](std::size_t i) const { return lhs[i] + rhs[i]; } private: LHS const& lhs; RHS const& rhs; }; template Vector_Sum operator+(LHS const& lhs, RHS const& rhs) { return { lhs, rhs }; } template class Vector_Product { public: Vector_Product(LHS const& lhs, RHS const& rhs) : lhs{lhs}, rhs{rhs} { } auto operator[](std::size_t i) const { return lhs[i] * rhs; } private: LHS const& lhs; RHS const& rhs; }; template Vector_Product operator*(LHS const& lhs, RHS const& rhs) { return { lhs, rhs }; } int main() { using Vec = Vector; Vec a { 1, 2 }; Vec b { 3, 4 }; Vec c { 5, 6 }; Vec d { 0.5 * ((a + b) * 2.0 + c) }; }