//: C05:MyVector2.cpp // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. // Handles sums of any length with expression templates. #include #include #include #include using namespace std; // A proxy class for sums of vectors template class MyVectorSum; template class MyVector { T data[N]; public: MyVector& operator=(const MyVector& right) { for(size_t i = 0; i < N; ++i) data[i] = right.data[i]; return *this; } template MyVector& operator=(const MyVectorSum& right); const T& operator[](size_t i) const { return data[i]; } T& operator[](size_t i) { return data[i]; } }; // Allows mixing MyVector and MyVectorSum template class MyVectorSum { const Left& left; const Right& right; public: MyVectorSum(const Left& lhs, const Right& rhs) : left(lhs), right(rhs) {} T operator[](size_t i) const { return left[i] + right[i]; } }; template template MyVector& MyVector:: operator=(const MyVectorSum& right) { for(size_t i = 0; i < N; ++i) data[i] = right[i]; return *this; } // operator+ just stores references template inline MyVectorSum,MyVector > operator+(const MyVector& left, const MyVector& right) { return MyVectorSum,MyVector > (left,right); } template inline MyVectorSum, MyVector > operator+(const MyVectorSum& left, const MyVector& right) { return MyVectorSum, MyVector > (left, right); } // Convenience functions for the test program below template void init(MyVector& v) { for(size_t i = 0; i < N; ++i) v[i] = rand() % 100; } template void print(MyVector& v) { for(size_t i = 0; i < N; ++i) cout << v[i] << ' '; cout << endl; } int main() { srand(time(0)); MyVector v1; init(v1); print(v1); MyVector v2; init(v2); print(v2); MyVector v3; v3 = v1 + v2; print(v3); // Now supported: MyVector v4; v4 = v1 + v2 + v3; print(v4); MyVector v5; v5 = v1 + v2 + v3 + v4; print(v5); } ///:~