我读过这篇文章,它说明了如何__VA_OPT__使用函数宏来递归扩展宏。我想实现类似的东西,不同之处在于宏是在嵌套上下文中扩展的。
输入:
NEST_RECURSIVE(A, B, C)
Run Code Online (Sandbox Code Playgroud)
应该产生(顺序无关):
((( | C) | B) | A)
Run Code Online (Sandbox Code Playgroud)
我的方法稍微概括了这篇文章:
#define PARENS ()
#define EXPAND(...) EXPAND4(EXPAND4(EXPAND4(EXPAND4(__VA_ARGS__))))
#define EXPAND4(...) EXPAND3(EXPAND3(EXPAND3(EXPAND3(__VA_ARGS__))))
#define EXPAND3(...) EXPAND2(EXPAND2(EXPAND2(EXPAND2(__VA_ARGS__))))
#define EXPAND2(...) EXPAND1(EXPAND1(EXPAND1(EXPAND1(__VA_ARGS__))))
#define EXPAND1(...) __VA_ARGS__
#define FOR_EACH_R(func, ...) __VA_OPT__(EXPAND(FOR_EACH_HELPER_R(func, __VA_ARGS__)))
#define FOR_EACH_HELPER_R(func, sub, ...) func(__VA_OPT__(FOR_EACH_AGAIN_R PARENS (func, __VA_ARGS__)), sub)
#define FOR_EACH_AGAIN_R() FOR_EACH_HELPER_R
#define MY_FUNC(nested, var) (nested | var)
#define NEST_RECURSIVE(...) FOR_EACH_R(MY_FUNC, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
当前代码产生以下输出:
(FOR_EACH_HELPER_R (MY_FUNC, B, C) | A)
Run Code Online (Sandbox Code Playgroud)
可以看出,扩展不会发生在第一级之后。
我想我必须EXPAND别的地方,但是,我不知道在哪里。
我想要做的事情完全有可能是不可能的,但是,C++20 之前的递归宏扩展方法(利用PP_NARG)确实适用于嵌套,所以我希望新的、更干净的方法可以使用它还有!