#include #include #include #include using namespace std; template class Operation> struct BinExpr; template struct BasicType { using ObjType = Type; }; template class Operation> struct BasicType> { using ObjType = typename BinExpr::ObjType; }; template class Operation> struct BinExpr { 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 { static Operation operation; return operation(d_lhs[ix], d_rhs[ix]); } operator ObjType() const { ObjType retVal; for (size_t ix = 0, end = size(); ix != end; ++ix) retVal[ix] = (*this)[ix]; return retVal; } }; template BinExpr operator+(LHS const &lhs, RHS const &rhs) { return BinExpr(lhs, rhs); } struct VI: public vector { 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'; }