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

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

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

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

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

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

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

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

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

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


person Alex Tiger    schedule 30.10.2013    source источник
comment
Можете ли вы использовать функции С++ 11? Если это так, вы можете достичь того, чего хотите, используя новую функцию шаблона varadic.   -  person benjymous    schedule 30.10.2013
comment
@benjymous, на самом деле нет, потому что поддержка C++ 11 в GCC все еще является экспериментальной.   -  person Alex Tiger    schedule 30.10.2013


Ответы (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_EACHELEMMACROEND

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

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

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

ELEMMACRO(Elem1)
ELEMMACRO(Elem2)
ELEMMACRO(Elem3)
person Paul Fultz II    schedule 02.11.2013