Boost logo

Boost :

Subject: Re: [boost] [mpl] is there a or_seq like logical metafunction?
From: Larry Evans (cppljevans_at_[hidden])
Date: 2009-02-07 14:24:36

On 04/27/08 20:50, David Abrahams wrote:
> on Fri Mar 07 2008, Steven Watanabe <> wrote:
>> 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.
>> Not to mention that quote2 will not work on and_ and or_.
> Yeah, these should be rewritten in terms of mpl::find.
> Not sure why mpl::apply was used here either, though maybe I'm missign
> something.

The curren mpl::find uses and_ indirectly (in iter_fold_if.hpp:46).
Would such a recursive implementation still work?

Anyway, J.Fletcher is now attempting a variadic template rewrite of

which doesn't use and_; however, another alternative which does
short-circuit is attached. It uses eval_if to short-circuit the
evaluation. Fletcher's find, OTOH, used if_; however, I think
that's just because he's not interested in optimization yet.

A very similar or_ is done by simply exchanging the Zero and One
parameters. Interestingly enough, the current and_ uses
a similar pattern in that it recursively calls a template (and.hpp:23).

The attached (with the similar or.hpp) passes the logical.cpp test.

Boost list run by bdawes at, gregod at, cpdaniel at, john at