vs2015 c++ 宏展开枚举

本文讨论了在VS2015中使用C++宏和模板处理大量枚举类型的复杂性,以及遇到的编译问题和解决方案尝试。作者分享了如何通过宏定义实现常量代码的固定和参数化转换。
摘要由CSDN通过智能技术生成

C++宏-模板

vs2015 使用宏展开枚举


前言

corba客户端,使用了大量的枚举类型,需要对其标识和取值


一、开始编写代码,对每一个枚举需要写一大段if-else或者case

二、尝试使用模板,发现好像无法使用枚举元素名,返回字符串(不理解区域,尝试的方法可能不正确)。

二、使用宏,复杂的宏确实难搞,发现无法编译通过,或者结果不正确,花了很多时间实现。

#define ATTR(x) x

#define ARGS_IMPL2(base, count) base##count
#define ARGS_IMPL(base, count) ARGS_IMPL2(base, count)

#define COUNT_PARMS_IMP(x, ...) ATTR(COUNT_PARMS_IMP_HELPER(__VA_ARGS__,17,16,15,14,13,12, 11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
#define COUNT_PARMS_IMP_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11,_12,_13,_14,_15,_16,_17, N, ...) N
#define COUNT_PARMS(x,...) COUNT_PARMS_IMP(x, __VA_ARGS__)

#define ARG_VAL_0(arg) (throw ParamException("enum arg unkown(%s)",arg))
#define ARG_VAL_1(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_0(arg)))
#define ARG_VAL_2(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_1(arg, __VA_ARGS__)))
#define ARG_VAL_3(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_2(arg, __VA_ARGS__)))
#define ARG_VAL_4(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_3(arg, __VA_ARGS__)))
#define ARG_VAL_5(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_4(arg, __VA_ARGS__)))
#define ARG_VAL_6(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_5(arg, __VA_ARGS__)))
#define ARG_VAL_7(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_6(arg, __VA_ARGS__)))
#define ARG_VAL_8(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_7(arg, __VA_ARGS__)))
#define ARG_VAL_9(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_8(arg, __VA_ARGS__)))
#define ARG_VAL_10(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_9(arg, __VA_ARGS__)))
#define ARG_VAL_11(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_10(arg, __VA_ARGS__)))
#define ARG_VAL_12(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_11(arg, __VA_ARGS__)))
#define ARG_VAL_13(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_12(arg, __VA_ARGS__)))
#define ARG_VAL_14(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_13(arg, __VA_ARGS__)))
#define ARG_VAL_15(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_14(arg, __VA_ARGS__)))
#define ARG_VAL_16(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_15(arg, __VA_ARGS__)))
#define ARG_VAL_17(arg, v, ...) ((strcmp(arg,#v)==0) ? (v) : ATTR(ARG_VAL_16(arg, __VA_ARGS__)))

#define ARG_STRING_0(arg) ("unknown")
#define ARG_STRING_1(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_0(arg)))
#define ARG_STRING_2(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_1(arg, __VA_ARGS__)))
#define ARG_STRING_3(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_2(arg, __VA_ARGS__)))
#define ARG_STRING_4(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_3(arg, __VA_ARGS__)))
#define ARG_STRING_5(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_4(arg, __VA_ARGS__)))
#define ARG_STRING_6(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_5(arg, __VA_ARGS__)))
#define ARG_STRING_7(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_6(arg, __VA_ARGS__)))
#define ARG_STRING_8(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_7(arg, __VA_ARGS__)))
#define ARG_STRING_9(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_8(arg, __VA_ARGS__)))
#define ARG_STRING_10(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_9(arg, __VA_ARGS__)))
#define ARG_STRING_11(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_10(arg, __VA_ARGS__)))
#define ARG_STRING_12(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_11(arg, __VA_ARGS__)))
#define ARG_STRING_13(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_12(arg, __VA_ARGS__)))
#define ARG_STRING_14(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_13(arg, __VA_ARGS__)))
#define ARG_STRING_15(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_14(arg, __VA_ARGS__)))
#define ARG_STRING_16(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_15(arg, __VA_ARGS__)))
#define ARG_STRING_17(arg, v, ...) ((arg == v) ? (#v) : ATTR(ARG_STRING_16(arg, __VA_ARGS__)))

#define ARGS_TO_STRING(x, ...) ATTR(ARGS_IMPL(ARG_STRING_, COUNT_PARMS(x, __VA_ARGS__))(x, __VA_ARGS__))
#define ARGS_TO_VALUE(x, ...) ATTR(ARGS_IMPL(ARG_VAL_, COUNT_PARMS(x, __VA_ARGS__))(x, __VA_ARGS__))

总结

一些常不变的代码,可以固定起来。

  • 32
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值