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__))
总结
一些常不变的代码,可以固定起来。