2

如果定义类似于 MACRO(name, seq) 并且代码如下,如何访问宏中的每个元素:

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

我想生成下一个代码:

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

或类似的东西。换句话说,我想分别处理每个参数(我不在乎定义,即使它会像

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

元素可能更多,也可能更少。我试过__V_ARGS__(我只需要gcc),但我只能复制所有元素,而不是单独处理它们。

我能做些什么?

PS由于某些原因,我无法使用Boost。

4

1 回答 1

4

最简单的方法是使用这样的序列迭代(它不需要提升):

#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)
于 2013-11-02T03:50:18.203 回答