#ifndef __PBASE_EXPRESSION_TEMPLATE_CLASS_H__ #define __PBASE_EXPRESSION_TEMPLATE_CLASS_H__ template struct PExprGen{ operator const A&() const{ return *static_cast(this); } }; template class PAddExpr : public PExprGen >{ const A& p_a; const B& p_b; public: PAddExpr(const A& a, const B& b) : p_a(a), p_b(b){} double operator[](size_t i) const{ return p_a[i] + p_b[i]; } }; template inline PAddExpr operator + (const PExprGen& a, const PExprGen& b){ return PAddExpr(a,b); } template class PSubExpr : public PExprGen >{ const A& p_a; const B& p_b; public: PSubExpr(const A& a, const B& b) : p_a(a), p_b(b){} double operator[](size_t i) const{ return p_a[i] - p_b[i]; } }; template inline PSubExpr operator- (const PExprGen& a, const PExprGen& b){ return PSubExpr(a,b); } template class PMinusExpr : public PExprGen >{ const A& p_a; public: PMinusExpr(const A& a) : p_a(a){} double operator[](size_t i) const{ return - p_a[i]; } }; template inline PMinusExpr operator- (const PExprGen& a){ return PMinusExpr(a); } template class PTimesExpr : public PExprGen >{ const A& p_a; const double p_b; public: PTimesExpr(const A& a, double b) : p_a(a), p_b(b){} double operator[](size_t i) const{ return p_a[i]*p_b; } }; template inline PTimesExpr operator* (const PExprGen& a, double b){ return PTimesExpr(a,b); } template inline PTimesExpr operator* (double b, const PExprGen& a){ return PTimesExpr(a,b); } template class PDivExpr : public PExprGen >{ const A& p_a; const double p_b; public: PDivExpr(const A& a, double b) : p_a(a), p_b(b){} double operator[](size_t i) const{ return p_a[i]/p_b; } }; template inline PDivExpr operator/ (const PExprGen& a, double b){ return PDivExpr(a,b); } #endif