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
#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
#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
#include
#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