Перевести последовательность в параметрах макроса в отдельные макросы

Как получить доступ к каждому элементу в макросе, если определение похоже на MACRO (name, seq) и код похож на:

MACRO("TheName",
(Elem1)
(Elem2)
(Elem3)
)

Я хочу сгенерировать следующий код:

MACRO("TheName",
ELEMMACRO(Elem1)
ELEMMACRO(Elem2)
ELEMMACRO(Elem3)
)

Или что-то типа того. Другими словами, я хочу обрабатывать каждый параметр отдельно (меня не волнует определение, даже если это будет что-то вроде

MACRO("TheName",
Elem1,
Elem2,
Elem3
)

Там может быть больше элементов, может быть меньше. я пытался __V_ARGS__ (Мне это нужно только для gcc), но я могу только копировать все элементы, а не обрабатывать их отдельно.

Что я могу сделать?

Постскриптум По некоторым причинам я не могу использовать Boost.

1

Решение

Самый простой способ — использовать итерацию последовательности следующим образом (она не требует повышения):

#define PRIMITIVE_SEQ_ITERATE(...) __VA_ARGS__ ## _END
#define SEQ_ITERATE(...) PRIMITIVE_SEQ_ITERATE(__VA_ARGS__)

#define MACRO_EACH(seq) SEQ_ITERATE(MACRO_EACH_1 seq)
#define MACRO_EACH_1(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_2
#define MACRO_EACH_2(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_1
#define MACRO_EACH_1_END
#define MACRO_EACH_2_END

Который назовет ваш ELEMMACRO для каждого элемента в последовательности:

MACRO_EACH
(
(Elem1)
(Elem2)
(Elem3)
)

И расширимся до этого:

ELEMMACRO(Elem1)
ELEMMACRO(Elem2)
ELEMMACRO(Elem3)
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]