|
Boost : |
From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2002-09-19 17:01:19
Terje Slettebø wrote:
> Consider the "factorial" metafunction, again:
>
> template<class V>
> struct factorial
> {
> typedef typename V::type Value;
>
> typedef typename apply_if<equal_to<Value,value<Value,0> >,
> value<Value,1>,
> mul<Value,factorial<prior<Value> > >
> >::type type;
> }
>
> I had first planned to look at a comparison with using "eva,"
> but I realized that I had a hard time finding out how I could
> write the above, using "eva," since the call to factorial is used
> as a parameter to "mul," and unlike apply_if, that doesn't evaluate
> its arguments, which is what makes your first "eva" example work.
Here's how you could write it with lazy-lambda:
template< typename N >
struct factorial
{
typedef typename apply_if<
equal_to< N, int_c<0> >
, int_c<1>
, lazy<
multiplies< N, factorial< prior<N> > >
>
>::type type;
};
It even works :).
Aleksey
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk