Boost logo

Boost Users :

Subject: Re: [Boost-users] [RFC] Signals bound to phoenix functions
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2010-06-24 05:20:10


On Thursday 24 June 2010 09:31:36 Thomas Heller wrote:
> On Wednesday 23 June 2010 18:50:38 Ovanes Markarian wrote:
> > Stephan, hi!
> >
> > please see my answer below.
> >
> > On Wed, Jun 23, 2010 at 5:42 PM, Stephan Menzel
>
> <stephan.menzel_at_[hidden]>wrote:
> > > Unless I want to add something. Unfortunately I can't always take
> > > wrap()s output but have to modify a little. In fact, my Queue needs to
> > > be templatized as well, modifying the behaviour of the functor. I have
> > > a template parameter "Calling". When it is true, another function
> > > shall be called by the functor after the method was posted. Now I
> > > wanted to do this by phoenix:
> > >
> > > template <bool Calling>
> > > class Queue {
> > >
> > > template<typename Handler>
> > >
> > > void post(Handler n_handler) {
> > >
> > > m_iosrv.post(n_handler);
> > >
> > > };
> > >
> > > ...
> > >
> > > template<typename SlotSignature, typename SlotFunction>
> > > boost::signals2::connection
> > >
> > > connect(boost::signals2::signal<SlotSignature> &n_signal, SlotFunction
> > > n_method) {
> > >
> > > return n_signal.connect(
> > >
> > > if_( CallingBack ) [
> > >
> > > post(n_method) ,
> > > m_signal_callback()
> > >
> > > ] .else_ [
> > >
> > > m_iosrv.wrap( n_method )
> > >
> > > ] );
> > >
> > > };
> > >
> > > ...
> >
> > It is difficult to conclude smth from the code without having a
> > self-containing example. But my assumption is that in the 'else'-branch
> > your code does not generate a function object. As far as I can see in the
> > 'if'-branch your code generates a function object using the the
> > comma-operator (if that operator is overloaded in Phoenix), in the
> > 'else'-branch you just have a normal function call, which is not lazy and
> > does not return a function-object.
>
> Phoenix statements always return void.
> What you want is:
> phoenix::if_else( CallingBack, /* then functor */, /*else functor */ )
>
> For reference:
> http://www.boost.org/doc/libs/1_43_0/libs/spirit/phoenix/doc/html/phoenix/c
> omposite.html#phoenix.composite.operator and
> http://www.boost.org/doc/libs/1_43_0/libs/spirit/phoenix/doc/html/phoenix/c
> omposite.html#phoenix.composite.statement (There is a note at the end of
> that section, for the return value of phoenix statements)

Sorry misunderstood your problem ...
The correct answer is:
post, m_signal_callback() and m_iosrv.wrap need to be
lazy expressions.
To achieve that for the first two, you can have a phoenix::function wrapper,
for the last one, you can use phoenix::bind (which can be used for the first
two as well).


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