#include #include #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 ) #endif // I'm trying to write alternative versions of INVOKE for the above sets of macros, // 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) ) #endif // 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() { A2(1,2) }