我正在写一些 Boost.Preprocessor 元程序,我有以下问题。考虑以下宏(这是为了说明问题而进行的简化):
#define ITERATION_IMPL(p1, p2, p3, p4) ((p1),(p2),(p3),(p4))
#define ITERATION(args) ITERATION_IMPL(hello, args(), world)
#define ARGS() a, b
ITERATION(ARGS)
预处理后的输出是这样的:
((hello),(a, b),(world),())
这表明args()
没有分成多个参数。根据我对标准的理解,宏的参数在被粘贴到替换列表之前是完全展开的。因此,我期望以下扩展顺序:
ITERATION(ARGS)
ITERATION_IMPL(hello, ARGS(), world)
ITERATION_IMPL(hello, a, b, world)
((hello),(a),(b),(world))
那是我想要的结果。如何在不修改ITERATION_IMPL
和调用本身的情况下实现它?
编辑:如果不可能(我猜是),请根据任何 C 或 C++ 标准进行解释。