Boost logo

Boost :

From: Aleksey Gurtovoy (agurtovoy_at_[hidden])
Date: 2003-01-01 04:43:35


I am going to use our wonderful Preprocessor library to generate a
metafunction that basically looks like this:

    template<
          int C0, int C1, ..., int Cn
>
    struct max_arity
    {
        static int const value = Cn > 0 ? Cn : ( Cn-1 > 0 ? Cn-1 :
            ... ( C1 > 0 ? C1 : ( C0 > 0 ? C0 : -1 ) ) )
            ;
    };

So here's what I came up with:

    template<
          BOOST_PP_ENUM_PARAMS(BOOST_MPL_METAFUNCTION_MAX_ARITY, int C)
>
    struct max_arity
    {
        BOOST_STATIC_CONSTANT(int,
            value = BOOST_PP_LIST_FOLD_LEFT(
                      AUX_MAX_ARITY_OP
                    , -1
                    , (0, (1, (2, (3, (4, BOOST_PP_NIL)))))
                    )
            );
    };

I love everything about it except for the "(0, (1, (2, (3, (4,
BOOST_PP_NIL)))))" part. I would like the above to become something along
these lines:

            value = BOOST_PP_RANGE_FOLD_LEFT(
                      AUX_MAX_ARITY_OP
                    , -1
                    , BOOST_PP_RANGE(0, 4)
                    )

or, better yet,

            value = BOOST_PP_FOLD_LEFT(
                      AUX_MAX_ARITY_OP
                    , -1
                    , BOOST_PP_RANGE(0, 4)
                    )

where 'BOOST_PP_FOLD_LEFT' is a generic algorithm that can be used on all PP
sequences.

How hard would it be to have something like this?

I suppose it's possible to generate the code I need using BOOST_PP_WHILE,
but IMO that solution wouldn't be as conceptually nice and intuitive as the
above.

Aleksey


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