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

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

你可能感兴趣的:(C++)