#include #include #include using namespace std; enum { ADD, SUB, }; template struct BinExpr; template struct BasicType { using ObjType = Type; }; template struct BasicType> { using ObjType = typename BinExpr::ObjType; }; template struct BinExpr { template struct Operation; 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(); } value_type operator[](size_t ix) const { return Operation::cpt(d_lhs[ix], d_rhs[ix]); } operator ObjType() const { ObjType retVal; retVal.resize(size()); 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::Operation { static auto cpt(auto const &lhs, auto const &rhs) { return lhs + rhs; }; }; template template struct BinExpr::Operation { static auto cpt(auto const &lhs, auto const &rhs) { return lhs - rhs; }; }; // define the operators: ADD, SUB, etc. The operation to perform is // specified as enum value 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 = 10000; VI() : vector(s_max, 1) {} }; int main(int argc, char **argv) { if (argc == 1) { cout << "arg1: number of iterations\n"; return 0; } VI a, b, c, d; for (size_t idx = 0, count = stoul(argv[1]); idx != count; ++idx) d = a + b + c + d + a + b + c + d; cout << d.front() << ", " << d.back() << '\n'; for (size_t idx = 0, count = stoul(argv[1]); idx != count; ++idx) d = a - b - c - d - a - b - c - d; cout << d.front() << ", " << d.back() << '\n'; }