#include "decaf/expr.hxx" class Foo { private: template friend class BinExpr; template friend class UnExpr; template friend struct Reify; Foo(const NOINIT&) {} public: int x; Foo(int x) : x(x) {} }; namespace decaf { namespace internal { DECLARE_BINOP(ADD,Foo,Foo,Foo,out.x = l.x+r.x) DECLARE_BINOP(SUB,Foo,Foo,Foo,out.x = l.x-r.x) DECLARE_BINOP(MUL,Foo,Foo,Foo,out.x = l.x*r.x) DECLARE_BINOP(EQ,Foo,Foo,bool,out = l.x==r.x) DECLARE_PARTIAL_UNOP(INV,Foo,Foo,out.x = 1/r.x; return (r.x!=0)) }} Foo frobble() { Foo a(1); a = a+a+a; a = a*a; a = a/a; (void)(a==(a+a)); return a; }