Boost logo

Boost :

From: Brian McNamara (lorgon_at_[hidden])
Date: 2003-08-12 07:30:22


On Mon, Aug 11, 2003 at 10:54:40PM -0500, Aleksey Gurtovoy wrote:
> Gary Powell wrote:
> > >Consider the following snippet:
> > >
> > > void show_warning( message_dialog const&, user_message );
> > > void post_command( boost::function<void()> );
> > >
> > > int main()
> > > {
> > > boost::function<void( user_message )> f(
> > > bind( &post_command
> > > , ????( bind( &show_warning, message_dialog(), _1 ) )
> > > // ^^^^ what goes here?
> > > )
> > > );
> > > }
> > >
> > >Could we make it work, somehow? Offers of a hand-written function
> > >performing the composition are not accepted :)
> > >
> >
> > I'm a bit confused by your request,
> > Do you want both fns to be called?
>
> Nope. Please see http://article.gmane.org/gmane.comp.lib.boost.devel/23466
> for the semantics clarification. Basically, I want the whole bind
> expression to return an unary function object which, when invoked, will
> use the argument to construct a nested nullary function object:
>
> bind( &show_warning, message_dialog(), <arg> )
>
> and pass it as an argument to 'post_command'.
>
> Does it make more sense now?

I can't speak for bind/lambda, although I imagine there must be a way,
probably involving delaying the evaluation of _1 for one step.

Using FC++, it would be

   using fcpp::fun1;
   using fcpp::lambda;
   using fcpp::ptr_to_fun;
   fun1<user_message,void> f =
      lambda(X)[ ptr_to_fun(post_command)[
         lambda()[ ptr_to_fun(show_warning)[ message_dialog(), X ]
            ] ] ];

The explicit lambda notation makes it easier to (mentally and
syntactically) sort out functions like these where the placeholder
variables are bound by a lambda (bind expression) other than the
innermost one.

(The calls to to ptr_to_fun above are necessary only to promote the
function pointers into FC++ "functoids".)

-- 
-Brian McNamara (lorgon_at_[hidden])

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk