Для вариативных макросов не существует такой вещи, как расширение пакета, как для вариативных шаблонов.
Однако вы можете использовать Boost.Preprocessor (или его методы).
Если вам не нужны запятые между элементами, используйте
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define ID_OP(_, func, elem) func(elem)
#define APPLY_TO_ALL(func, ...) \
BOOST_PP_SEQ_FOR_EACH( \
ID_OP, func, \
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
)
// example call:
#define SomeTransformation(x) #x // stringize the argument
APPLY_TO_ALL(SomeTransformation, 1, 2, 3) // expands to "1" "2" "3"
Демо. С запятыми:
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/transform.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define ID_OP(_, func, elem) func(elem)
#define APPLY_TO_ALL(func, ...) \
BOOST_PP_SEQ_ENUM( \
BOOST_PP_SEQ_TRANSFORM( \
ID_OP, func, \
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
))
// example call:
APPLY_TO_ALL(SomeTransformation, 1, 2, 3) // expands to "1", "2", "3"
Демо. Проверьте вывод препроцессора с помощью g++ -std=c++11 -E -P file
.
person
Columbo
schedule
20.10.2014
IDENTITY
- это результат. Я только хочу, чтобы он был предварительно обработан для другого макроса, ничего больше. - person iFreilicht   schedule 21.10.2014IDENTITY_FOR_ALL(x,y,z,w)
расширилось доx,y,z,w
? - person David Young   schedule 21.10.2014x y z w
- person iFreilicht   schedule 21.10.2014