Boost logo

Boost Users :

Subject: [Boost-users] [preprocessor] using ENUM_PARAMS to generate macro call arguments
From: Krzysztof Czainski (1czajnik_at_[hidden])
Date: 2011-06-15 09:15:50


I'll try to illustrate what I am trying to do on this example:

#define VER 1

// given alternative sets of macros:
#if VER==1
#define M0()
#define M1( arg0 )
#define M2( arg0, arg1 )
#define M3( arg0, arg1, arg2 )
#define M4( arg0, arg1, arg2, arg3 )
#elif VER==2
#define V0( x )
#define V1( x, arg0 )
#define V2( x, arg0, arg1 )
#define V3( x, arg0, arg1, arg2 )
#define V4( x, arg0, arg1, arg2, arg3 )

// I'm trying to write alternative versions of INVOKE for the above sets of
// so that the interface below needs no #ifs
#if VER==1
#define INVOKE( n_args ) \
    BOOST_PP_CAT(M,n_args)( BOOST_PP_ENUM_PARAMS(n_args,arg) )
#elif VER==2
#define INVOKE( n_args ) \
    BOOST_PP_CAT(V,n_args)( dummy BOOST_PP_ENUM_TRAILING_PARAMS(n_args,arg)

// the interface implemented in terms of INVOKE
#define A0() INVOKE(0)
#define A1( arg0 ) INVOKE(1)
#define A2( arg0, arg1 ) INVOKE(2)
#define A3( arg0, arg1, arg2 ) INVOKE(3)
#define A4( arg0, arg1, arg2, arg3 ) INVOKE(4)

int main()

My goal here is to keep INVOKE as simple and non-redundant as possible,
because alternative versions of INVOKE for alternative sets of given macros
will be added later on.

Now the call A2(1,2) doesn't compile. If I understand correctly, the reason
is ENUM_PARAMS(n_args,arg) is passed to M2, while I need the result of macro
expansion of ENUM_PARAMS(...) to be passed to M2. So my question is: Is
there a way around this?

I attached a file ready to compile with the presented code.

Thanks in advance

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at