#include #include #include #include "function.hpp" using namespace std; namespace mpl=boost::mpl; namespace proto=boost::proto; namespace fusion=boost::fusion; template struct actor; struct phoenix_domain : proto::domain > {}; struct eval; template struct actor { BOOST_PROTO_BASIC_EXTENDS(Expr, actor, phoenix_domain) BOOST_PROTO_EXTENDS_SUBSCRIPT() template struct result; typedef actor actor_type; template struct result : boost::result_of&)> {}; template struct result : boost::result_of&)> {}; template typename boost::result_of::type operator()(const A0 &a0) const { fusion::vector args(a0); return eval()(*this, args); } template typename boost::result_of::type operator()(const A0 &a0, const A1 &a1) const { fusion::vector args(a0, a1); return eval()(*this, args); } }; template struct arg {}; struct at : proto::callable { template struct result; template struct result &)> : fusion::result_of::at {}; template struct result &)> : fusion::result_of::at {}; template typename fusion::result_of::at::type operator()(Cont &cont, const arg &) const { return fusion::at(cont); } }; actor > >::type> const _1 = {{{}}}; actor > >::type> const _2 = {{{}}}; actor > >::type> const _3 = {{{}}}; struct eval : proto::or_< proto::function, proto::when >, at(proto::_state, proto::_value)> , proto::when > > {}; int main() { int i = 41; int j = (_1+1)(i); function func1 = _1 + func1(_1); func1.display(); cout << j << "\n"; return 0; }