无用的抱怨
找不到一个比较好的方法调试宏,宏每一步的替换结果无法仅仅从代码上看出来了,特别是多层嵌套。
真的是油饼!不晓得为啥整个这个宏编程!
老子终于找到是什么方向了,叫宏重载,真的是干他妈!找了老子一下午!
宏重载介绍
正经点说:宏重载准确说是一种C++编程技巧,巧妙利用#define和可变参数结合,让宏定义根据参数的数量,调用不同的函数,具体原理是根据参数个数调用MOCK_FUNCTION##N(可以自定义这个名字、N是指具体参数个数)。
注意:这里的重载不是传统意义上的重载,这里重载的方法名不一样。
demo实例
下面给出一个例子:
效果是FIGHT(2,2); 最后会调用FIGHT2(2,2)方法。
#include "iostream"
#define __NARG__(...) __NARG_I_(__VA_ARGS__, __RSEQ_N())
#define __NARG_I_(...) __ARG_N(__VA_ARGS__)
#define __ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, \
_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, \
_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, \
_63, N, ...) N
#define __RSEQ_N() \
63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, \
34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, \
5, 4, 3, 2, 1, 0
// general definition for any function name
#define _VFUNC_(name, n) name##n
#define _VFUNC(name, n) _VFUNC_(name, n)
// 前半部分生成方法的名字,此处是MOCK_FUNCTION2,后半部分是生成参数,此处结果是(2,2)
// 合起来之后是 MOCK_FUNCTION2(2,2)
#define VFUNC(func, ...) _VFUNC(func, __NARG__(__VA_ARGS__))(__VA_ARGS__)
// definition for FIGHT,效果 FIGHT(可变参数) -> 调用FIGHTN(N个参数)
#define FIGHT(...) VFUNC(MOCK_FUNCTION, __VA_ARGS__)
#define FIGHT1(arg) WithOne(arg)
#define FIGHT2(arg_one, arg_two) WithTwo(arg_one, arg_two)
int MOCK_FUNCTION1(int a) {
printf("a");
return 0;
}
int MOCK_FUNCTION2(int a, int b) {
printf("ab");
return 0;
}
int main(){
FIGHT(2,2);
return 0;
}
本文介绍了C++中的宏重载技术,这是一种利用#define和可变参数实现宏定义根据参数数量调用不同函数的编程技巧。通过一个具体的demo实例展示了如何使用宏重载,例如FIGHT(2,2)最终会调用FIGHT2(2,2)方法,从而简化复杂宏的调试和使用。
385

被折叠的 条评论
为什么被折叠?



