Boost logo

Boost :

From: Giovanni Piero Deretta (gpderetta_at_[hidden])
Date: 2008-03-07 12:41:12


On Fri, Mar 7, 2008 at 4:32 PM, Steven Watanabe <watanabesj_at_[hidden]> wrote:
> AMDG
>
>
> Giovanni Piero Deretta wrote:
> > It seems a perfect application for fold:
> >
> > template<typename Seq>
> > struct or_seq
> > : mpl::apply<
> > mpl::fold<mpl::_1, mpl::false_, mpl::quote2<mpl::or_> >
> > , Seq
> > > {};
> >
> > template<typename Seq>
> > struct and_seq
> > : mpl::apply<
> > mpl::fold<mpl::_1, mpl::true_, mpl::quote2<mpl::and_> >
> > , Seq
> > > {};
> >
>
> Not quite, because we want it to short circuit.

Hum, I think it actually does short circuit evaulation (haskel-like):

struct bad {};
typedef mpl::vector<mpl::false_, mpl::false_, bad> ffb_v;
typedef mpl::vector<mpl::false_, mpl::false_, fail> tfb_v;

or_seq<ffb_v> gives the expected compile time error (error: no type
named 'type' in 'struct fail') , while
or_seq<tfb_v> compiles fine (and yelds true).

> Not to mention that quote2 will not work on and_ and or_.

I now see that and_ and or_ take n parameters, so the compiler should
complain about quote2. (it did work for me
because of the gcc extension that allows a template with default
parameters to match a template template argument with less
parameters.)

This should fix the problem:

template<typename Seq>
struct or_seq
     : mpl::apply<
           mpl::fold<mpl::_1, mpl::false_,
mpl::lambda<mpl::or_<mpl::_,mpl::_> > >
         , Seq
> {};

Not shorter than your solution, but it is an MPL only solution.

Playing with MPL is always fun :).

--
gpd
>
>  In Christ,
>  Steven Watanabe
>
>
>
>  _______________________________________________
>  Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>

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