Использование boost.preprocessor
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#define SEQ (w)(x)(y)(z)
#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)
BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_
Это не совсем то же самое, что даже в случае одного аргумента требуется скобка.Но он допускает переменное число аргументов в скобках.
Также возможна возможность: использовать BOOST_PP_IF, BOOST_PP_EQUAL и BOOST_PP_TUPLE_ELEM для выполнения чего-то вроде:
MACRO(1, a)
MACRO(2, (a,b) )
MACRO(3, (a,b,c) )
или около того.