#include #include #include #include #include using namespace std; struct placeholder_plus { template L operator() (const L& a, const R& b) {return a + b;} // template L operator() (L a, L b) {return a + b;} }; struct placeholder_minus { template L operator() (const L& a, const R& b) {return a - b;} }; struct placeholder_shift { template L& operator() (L& stream_object, const R& r) { return stream_object << r;} }; template struct ref_builder; template struct equator { R r; equator(R r_) : r(r_) {} template const T& operator() (T& b) { return b = ref_builder::ref(r, b); } }; template struct equator_1 { R r; L l; equator_1(L l_, R r_) : r(r_), l(l_) {} template const L operator() (T& b) { return l = ref_builder::ref(r, b); } }; template struct ref_builder; template struct functor { L lhs; R rhs; F f; functor(L l_, R r_, F f_) : lhs(l_), rhs(r_), f(f_) {} // The result of operator () is actually a result of operation ref(lhs), template typename ref_builder::type operator() (T& a) {return f(ref_builder::ref(lhs, a), ref_builder::ref(rhs, a));} }; struct placeholder { template equator operator= (const R& r) {return equator(r);} }; template struct var_holder { T& var; var_holder(T& t) : var(t) {} template equator_1 operator= (const R& r) {return equator_1(var, r);} // operator T& () {return var;} }; template var_holder var(T& var) {return var_holder(var);} template struct ref_builder { typedef const TP& type; static type ref(type t, T) {return t;} }; template struct ref_builder { typedef L type; static type ref(placeholder p, type a) {return a;} }; template struct ref_builder, R> { typedef L& type; static type ref(var_holder p, R&) {return p.var;} }; template struct ref_builder, T > { typedef typename ref_builder::type type; template static type ref(functor p, A& a) {return p(a);} }; template functor operator+ (placeholder lhs, const R& rhs) { return functor(lhs, rhs, placeholder_plus()) ; } template functor , R, placeholder_plus> operator+ (functor lhs, const R& rhs) { return functor, R, placeholder_plus>(lhs, rhs, placeholder_plus()) ; } template functor operator- (placeholder lhs, const R& rhs) { return functor(lhs, rhs, placeholder_minus()) ; } template functor , R, placeholder_minus> operator- (functor lhs, const R& rhs) { return functor, R, placeholder_minus>(lhs, rhs, placeholder_minus()) ; } template functor, placeholder, placeholder_shift> operator<< (L& stream_obj, placeholder rhs) { return functor, placeholder, placeholder_shift >(var_holder(stream_obj), rhs, placeholder_shift()) ; } template functor, var_holder, placeholder_shift> operator<< (L& stream_obj, var_holder rhs) { return functor, var_holder, placeholder_shift >(var(stream_obj), rhs, placeholder_shift()) ; } template functor, functor, placeholder_shift> operator<< (L& stream_obj, const functor& f) { return functor, functor, placeholder_shift >(var_holder(stream_obj), f, placeholder_shift()) ; } template functor, R, placeholder_shift> operator<< (functor lhs, R rhs) { typedef functor type; return functor(lhs, rhs, placeholder_shift()) ; } placeholder _1; int main() { vector v(3); std::string space = "\n"; v[0] = 1; v[1] = 2; v[2] = 3; int i = 0; for_each(v.begin(), v.end(), _1 = _1 + 6 ); for_each(v.begin(), v.end(), cout << _1 + 8.3 << ": " << _1 << "\n"); // (**) for_each(v.begin(), v.end(), var(i) = _1 + var(i)); cout << i << endl; }