Rozental, Gennadiy wrote:
> > I hope you mean "what it does/how to use it" as opposite to 
> > "how it does what it does" ;).
> 
> In fact it is second ;-)

See http://aspn.activestate.com/ASPN/Mail/Message/boost/1156353 for the
sketch. The full implementation is just way too complicated to describe in
words. The code is always there, of course :).

> 
> >     // numbered placeholders semantics
> >     plus<_1, int_c<5> > == bind<meta_fun2<plus>,_1,int_c<5> >
> >     plus< int_c<5>,_1 > == bind<meta_fun2<plus>,int_c<5>,_1 >
> >     plus< int_c<5>,_2 > == bind<meta_fun2<plus>,int_c<5>,_2 >
> >     plus<_1,_2> == bind<meta_fun2<plus>,_1,_2>
> >     plus<_2,_1> == bind<meta_fun2<plus>,_2,_1>
> >     
> >     logical_or< is_same<_1,int>, is_same<_1,long> >
> >         = bind< meta_fun2<logical_or>
> >             , bind< meta_fun2<is_same>,_1,int >
> >             , bind< meta_fun2<is_same>,_1,long >
> >             >
> > 
> >     is_same< _1, add_pointer<_2> >
> >         == bind< meta_fun2<is_same>
> >             , _1
> >             , bind< meta_fun1<add_pointer>, _2 >
> >             >
> 
> It would help if you start with what meta_fun[n] are, cause 
> they are not covered in docs. 

'meta_fun[n]' (to be renamed to 'quote[n]') converts a metafunction
(http://www.mywikinet.com/mpl/paper/mpl_paper.html#metafunctions.simple) of
arity 'n' into the corresponding metafunction class
(http://www.mywikinet.com/mpl/paper/mpl_paper.html#metafunctions.classes).

> Also if I understand correctly it require 
> template template parameters. 

Yes.

> How then it works for MSVC6.5?

It ('meta_fun') doesn't. Lambda facility does, because on deficient
compilers it employs intrusive introspection:

    template< typename T > struct identity
    {
        typedef T type;
        BOOST_MPL_AUX_LAMBDA_SUPPORT(1,identity,(T)) // here
    };

The marked line is required if you want to use 'identity' in lambda
expressions on compilers that don't support partial specialization or
template template parameters.

[...]

> So the _ placeholder is substituted with appropriated numbered 
> one based on position in expression. How did you managed to achieve 
> this?

Well, I just do that - when resolving each bind's argument I analyze if it
is the unnamed placeholder, and if it is, then I substitute it for the
current numbered equivalent and "increment" the count. See
"boost/mpl/aux_/preprocessed/plain/bind.hpp" for the details. For comparison
purposes, "boost/mpl/aux_/preprocessed/plain/basic_bind.hpp" contains the
preprocessed version _without_ the unnamed placeholder support.

HTH,
Aleksey
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to