小编Sal*_*age的帖子

如何在嵌套上下文中通过 __VA_OPT__ 扩展递归宏

我读过这篇文章,它说明了如何__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)确实适用于嵌套,所以我希望新的、更干净的方法可以使用它还有!

c++ macros c-preprocessor variadic-macros c++20

1
推荐指数
1
解决办法
670
查看次数

标签 统计

c++ ×1

c++20 ×1

c-preprocessor ×1

macros ×1

variadic-macros ×1