Boost logo

Boost Users :

Subject: Re: [Boost-users] [phoenix] Extending actors
From: paul Fultz (pfultz2_at_[hidden])
Date: 2012-02-24 12:11:59


Thanks so much for the help. A couple more questions: 1) Is it possible to add an enable parameter to is_actor in futureversions of phoenix? 2) Is the is_actor trait used internally by phoenix? The reason I ask is I am thinking about using my own is_actor trait for my extended actors unitl maybe this gets updated in boost. ----- Original Message ----- > From: Thomas Heller <thom.heller_at_[hidden]> > To: boost-users_at_[hidden] > Cc: > Sent: Thursday, February 23, 2012 2:42 AM > Subject: Re: [Boost-users] [phoenix] Extending actors > > DISCLAIMER: All code was written without having been run through a compiler. It > might or might compile. This is due to a missing testcase. > > On 02/23/2012 01:57 AM, paul Fultz wrote: >> Hi all, >> >> I am wanting to extend actors to access a member variable from the class. > In the >> examples they show extending an acotr by using a lazy function to call the > function. >> I was thinking I could use a lazy function to access the member, something > like this: >> >> template<typename Expr> >> struct point_actor >>       : actor<Expr> >> { >>       typedef actor<Expr>  base_type; >>       typedef point_actor<Expr>  that_type; >> >>       point_actor( base_type const&  base ) >>           : base_type( base ) {} >> >>       typename expression::function<x_impl, that_type>::type x; >>       typename expression::function<y_impl, that_type>::type y; >> >> }; > > The second template argument is the type for the first function argument. In the > example it is *this. and passed to the expression in the member function. > In your example, you would need to initialize x properly, maybe like that: > > typedef expression::function<x_impl, that_type> x_expr; > typedef expression::function<y_impl, that_type> y_expr; > > point_actor(base_type const & base) >     : base_type(base) >     , x(x_expr::make(x_impl(), base)) >     , y(y_expr::make(y_impl(), base)) > {} > > Might actually work (NOTE: due to the PODness of the expression, we need to use > the make function to create and initialize the expr properly!) > >> Where x_impl and y_impl are lazy functions that access the x and y > variable. >> Would this work as member variables, rather than member functions? Also, >> why wouldnt the second parameter to expression::function take just actor >> instead of just point_actor<Expr>? Does that make sense? The reason I > ask is I would like to >> control the actor that is returned and do something like this(using the > above actor): >> >> template<typename Expr> >> struct rect_actor >>       : actor<Expr> >> { >>       typedef actor<Expr>  base_type; >>       typedef rect_actor<Expr>  that_type; >> >>       rect_actor( base_type const&  base ) >>           : base_type( base ) {} >> >>       typename expression::function<top_impl, point_actor>::type top; >>       typename expression::function<bottom_impl, point_actor>::type > bottom; >> >> }; >> >> expression::terminal<phoenix::argument<1>, rect_actor>  arg1; >> (cout<<  arg1.top.x)(my_rect()); > > Now this gets interesting ;) > To control the actor that gets returned, you have to implement some trickery! > This is of course possible. > Instead of: > > typename expression::function<top_impl, point_actor>::type > > You have to use your own expression type: > > namespace expression > { >     // This is for a function taking two arguments ... (The functor and >     // the argument to the functor) >     template <template <typename> Actor, typename A0, typename A1> >     struct custom_actor_function >       : boost::phoenix::expr_ext< >         Actor                        // This is the actor we would >                                       // like to get the expression >                                       // get wrapped in. >       , boost::phoenix::tag::function // This tag is important, this >                                       // tells proto that this >                                       // expression is a lazy function. >       , A0 >       , A1 >     > {}; > } > > now use it as follows: > > > typedef >     expression::custom_actor_function< >         rec_actor >       , top_impl >       , point_actor >     > >     top_fun_expr; > > typename top_fun_expr::type const > top() > { >     return top_fun_expr::make(top_impl(), *this); > } > > This should let you write: > > expression::terminal<phoenix::argument<1>, rect_actor>  arg1; > (cout<<  arg1.top().x())(my_rect()); > >> Does that make sense? I can't seem to find any reference on the > predefined >> expressions, and I also can't find the header file for > expression::function. > > Shame on me ... the reference for the predefined expression is really > rudimentary. I didn't have the time to update them yet. Any help is > appreciated! > >> >> Finally, the is_actor trait doesn't seem work for extended actors.Is > there a >> workaround for that? > > Yes, you need to specialize it for your actor. > >> Thanks, >> Paul >> >> _______________________________________________ >> Boost-users mailing list >> Boost-users_at_[hidden] >> http://lists.boost.org/mailman/listinfo.cgi/boost-users > > _______________________________________________ > Boost-users mailing list > Boost-users_at_[hidden] > http://lists.boost.org/mailman/listinfo.cgi/boost-users >


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net