C++ 技巧之【宏定义重载】---- 一种比 Macro 更好的方式
背景
我们期望同样名字的宏针对不同个数的参数做出不同的反应,例如
#define FIGHT(arg) WithOne(arg)
#define FIGHT(arg_one, arg_two) WithTwo(arg_one, arg_two)
(注意:传统的 Macro 方法对于某些宏嵌套宏的情况具有限制,下面的方法是一种更为通用的实现)
但本身这段代码在 C/C++ 的编译器中是编译不过的,编译器是不允许宏的参数重载的
因此我们会想到或许我们可以通过以下路径解决上述问题
- 通过代码将 FIGHT(arg) 转化为 FIGHT1(arg);
FIGHT(arg_one, arg_two) 转化为 FIGHT2(arg_one, arg_two) - 定义 FIGHT1(arg) 为 With One; FIGHT2(arg_one, arg_two) 为 WithTwo(arg_one, arg_two)
实现
#define __NARG__(...) __NARG_I_(__VA_ARGS__, __RSEQ_N())
#define __NARG_I_(...) __ARG_N(__VA_ARGS__)
#define __ARG_N