#include #include #include using namespace std; enum { ADD, SUB, }; template struct BinExpr { template struct BasicType; template struct BasicType>; using ObjType = typename BasicType::ObjType; using value_type = typename ObjType::value_type; LHS const &d_lhs; RHS const &d_rhs; BinExpr(LHS const &lhs, RHS const &rhs) : d_lhs(lhs), d_rhs(rhs) {} size_t size() const { return d_lhs.size(); } template struct Operation; value_type operator[](size_t ix) const { return Operation::cpt(d_lhs[ix], d_rhs[ix]); // *************** this causes // calling // the proper // cpt **************** } operator ObjType() const { ObjType retVal; retVal.reserve(size()); for (size_t ix = 0, end = size(); ix != end; ++ix) new(&retVal[ix]) value_type{ (*this)[ix] }; return retVal; } }; template template struct BinExpr::BasicType { using ObjType = Type; }; template template struct BinExpr::BasicType> { using ObjType = typename BinExpr::ObjType; }; template template struct BinExpr::Operation { static value_type cpt(value_type const &lhs, value_type const &rhs) { return lhs + rhs; }; }; template template struct BinExpr::Operation { static value_type cpt(value_type const &lhs, value_type const &rhs) { return lhs - rhs; }; }; template BinExpr operator+(LHS const &lhs, RHS const &rhs) { return BinExpr(lhs, rhs); } template BinExpr operator-(LHS const &lhs, RHS const &rhs) { return BinExpr(lhs, rhs); } struct VI: public vector // define the data structure to { // operate on static size_t const s_max = 1;//0000; VI() : vector(s_max, 1) {} }; int main() { // vector one {1, 2, 3}; // vector two {4, 5, 6}; // // vector three = one + two + (one + two); // // auto four = one + two + (one + two); // // auto z = "hello world"; // // cout << z << '\n'; // // cout << three[0] << ' ' << three[2] << '\n'; // cout << four[0] << ' ' << four[2] << '\n'; VI a, b, c, d; d = a + b; // d = a - b - c - d - (a - b - c - d); // // d = a + b - (c + d) - (a + b - c + d); // // d = VI{}; // // d = a + b + c + d + (a + b + c + d); // cout << d.front() << ", " << d.back() << '\n'; }