C++ 支持宏重载效果

C++宏默认是不支持重载的,但可以通过特殊方法让宏支持重载。

可能你要问,支持宏重载有什么用处,那么,就以实例来尝试宏的重载。

为了要实现类的动态创建,我还想构建类的继承关系图,为了简化注册,所以我需要用宏来简化注册。

我需要以下宏来支持:

REG_CREATE1(className)

REG_CREATE2(className, baseName1)

REG_CREATE3(className, baseName1,  baseName2)

C++支持多继承,但为了方便,我不希望每次注册的时候,使用不同的宏,那么我就需要通过一个宏,间接达到重载的效果。

宏本身不支持重载,所以我们不能定义多个重名的宏,但如果我能自动获取参数个数,那么可以通过  REG_CREATE ##  SIZE 来自动展开成不同参数的宏

第一步、获取参数个数:

#define PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT(_1,_2,_3,_4,_5,_6,_7,_8,_9, N, ...) N
#define PRIVATE_MACRO_VAR_ARGS_IMPL(args)  PRIVATE_MACRO_VAR_ARGS_IMPL_COUNT args
#define COUNT_MACRO_VAR_ARGS(...)  PRIVATE_MACRO_VAR_ARGS_IMPL((__VA_ARGS__,10,9,8,7,6,5 4,3,2,1,0))

第二部、实现字符与计算得到的数字进行串接

#define PRIVATE_MACRO_CHOOSE_HELPER2(M, count)  M##count
#define PRIVATE_MACRO_CHOOSE_HELPER1(M, count)  PRIVATE_MACRO_CHOOSE_HELPER2(M, count)
#define PRIVATE_MACRO_CHOOSE_HELPER(M, count)   PRIVATE_MACRO_CHOOSE_HELPER1(M, count)

第三部、实现可以自动转发的宏

#ifdef WIN32
//EXPAND 用于解决windows上编译器将__VA_ARGS__展开成一个参数的问题
#define EXPAND(...) __VA_ARGS__
#define REG_DYNCREATE(...) EXPAND(PRIVATE_MACRO_CHOOSE_HELPER(PRIVATE_REG_DYNCREATE_, COUNT_MACRO_VAR_ARGS( __VA_ARGS__))( __VA_ARGS__))
#else
#define REG_DYNCREATE(...) PRIVATE_MACRO_CHOOSE_HELPER(PRIVATE_REG_DYNCREATE_, COUNT_MACRO_VAR_ARGS( __VA_ARGS__))( __VA_ARGS__)
#endif

至此就完成了宏重载效果了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值