<iostream>class ReferenceExpression{std::vector<double>& mReference;public:ReferenceExpression(std::vector<double>& Variable) : mReference(Variable) {}double Value(int i) { return mReference[i]; }};template <class TExpression1, class TExpression2>classSumExpression{TExpression1 mExpression1;TExpression2 mExpression2;public:SumExpression(TExpression1 Expression1,TExpression2 Expression2) : mExpression1(Expression1),mExpression2(Expression2) {}double Value(int i) {return mExpression1.Value(i) +mExpression2.Value(i);}};class vec{public:std::vector<double> a_;int size() const{return a_.size();}vec(std::vector<double> temp){a_ = temp;}vec& sum(const vec& a, const vec& b){for (int i = 0; i < a.size(); i++){a_[i] = a.a_[i] + b.a_[i];}return *this;}template <class TExpression>vec & operator=(TExpression Expression){for (int i = 0; i < a_.size(); i++)a_[i] = Expression.Value(i);return *this;}~vec(){}};int main(){clock_t time1, time2;const int n = 1e9;std::vector<double> a(n, 1.0);std::vector<double> b(n, 2.0);std::vector<double> c(n, 3.0);time1 = clock();typedef SumExpression < ReferenceExpression,SumExpression<ReferenceExpression,ReferenceExpression >>rhs_expression;auto d = rhs_expression(ReferenceExpression(a),SumExpression<ReferenceExpression,ReferenceExpression>(b, c));for (int i = 0; i < n; i++){d.Value(i);}time2 = clock();std::cout << "time " << 1000.0*(time2 - time1) / CLOCKS_PER_SEC << " ms" << std::endl;std::vector<double> dd(n, 0);vec a1(a); vec b1(b); vec c1(c);vec d1(dd);time1 = clock();d1 = d1.sum(d1.sum(a, b), c1);time2 = clock();printf("%f vec\n", d1.a_[0]);std::cout << "vec time " << 1000.0 * (time2 - time1) / CLOCKS_PER_SEC << " ms" << std::endl;return 0;}
auto d = rhs_expression(ReferenceExpression(a),SumExpression<ReferenceExpression,ReferenceExpression>(b, c))