Boost logo

Boost Users :

From: Paul Mensonides (yg-boost-users_at_[hidden])
Date: 2003-05-02 14:23:28


Tanton Gibbs wrote:
> You can use BOOST_PP_LIST_FOR_EACH
>
> #define ARG_LIST (char, (int, (unsigned int, (long, ...))))
> #define DO_IT(r, data, elem) void foo( elem );
>
> BOOST_PP_LIST_FOR_EACH( DO_IT, , ARG_LIST )
                                ^
This empty argument is undefined in C++. In C99, it is allowed and called a
"placemarker." Instead of passing nothing, just pass anything and ignore it.

// ----- //

#include <boost/preprocessor/list/for_each.hpp>

#define ARG_LIST \
    (char, (int, (unsigned, (long, BOOST_PP_NIL)))) \
    /**/
#define DO_IT(r, ignored, elem) \
    void foo( elem ); \
    /**/

BOOST_PP_LIST_FOR_EACH( DO_IT, ?, ARG_LIST )

#undef ARG_LIST
#undef DO_IT

// ----- //

Note that there are other ways to do this also. For instance, use of
"sequences" makes the definition of ARG_LIST easier:

// ----- //

#include <boost/preprocessor/seq/for_each.hpp>

#define ARGS \
    (char)(int)(unsigned)(long) \
    /**/
#define DO_IT(r, ignored, elem) \
    void foo( elem ); \
    /**/

BOOST_PP_SEQ_FOR_EACH( DO_IT, ?, ARGS )

#undef ARGS
#undef DO_IT

// ----- //

Of course, if what you want to generate is much larger, you might want to use
some form of vertical repetition:

// ----- //

#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/seq/elem.hpp>

#define ARGS \
    (char)(int)(unsigned)(long) \
    /**/

#define BOOST_PP_LOCAL_MACRO(n) \
    void foo( BOOST_PP_SEQ_ELEM(n, ARGS) ); \
    /**/
#define BOOST_PP_LOCAL_LIMITS \
    (0, BOOST_PP_SEQ_SIZE(ARGS) - 1) \
    /**/
#include BOOST_PP_LOCAL_ITERATE()

#undef ARGS

// ----- //

Regards,
Paul Mensonides


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net