扫描已有对象并使其生成一定格式的类(二)

接上一节 # 2.进阶方案 虽然脚本的方法简单快捷,但也带来了致命的问题,就是该什么时候去执行脚本进行扫描,代码随时在变动,但是脚本不会主动的去识别是否有改变,因此难以维护 脚本方案在经过讨论之后被否定了,转而采用宏来实现 方案:使用宏的伪递归实现遍历 先上代码 有太多东西要说 有空再写 涉及机密用

接上一节

# 2.进阶方案

虽然脚本的方法简单快捷,但也带来了致命的问题,就是该什么时候去执行脚本进行扫描,代码随时在变动,但是脚本不会主动的去识别是否有改变,因此难以维护

  • 脚本方案在经过讨论之后被否定了,转而采用宏来实现

方案:使用宏的伪递归实现遍历

先上代码 有太多东西要说 有空再写

涉及机密用*** 代替

#define BEGIN_*** \
    void Session(const saverestore& b, bool load) { \

#define BODY_***(type, name) \
    if (load) { \
        ***::Load<type>(name, b); \
    } else { \
        ***::Save<type>(name, b); \
    }

#define END_***(className) \
    } \
    void className::Save(const saverestore& b) { \
        Session(b, false); \
    } \
    void className::Load(const saverestore& b) { \
        Session(b, true); \
    } \
    void className::creatObj(const saverestore& b) {\
        new className(b); \
    }


//get macro args number with simple syntax check
#define SerialMacroArgCount(...) _SerialMacroArgCount(__VA_ARGS__, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, M, 31,F, 29, F, 27, F, 25, F, 23, F, 21, F, 19, F, 17, F, 15, F, 13, F, 11, F, 9, F, 7, F, 5, F, 3, A, A )
#define _SerialMacroArgCount(_0, _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, COUNT, ...) COUNT

//connect
#define SerialConcat(A, B) _SerialConcat(A, B)
#define _SerialConcat(A, B) A##B
                                                                                                                                               
//get arg1
#define GET_VA_ARG_1(...) _GET_VA_ARG_1(__VA_ARGS__, ) 
#define _GET_VA_ARG_1(a1, ...) a1

//for syntax check
#define _End_Session(...) SerialConcat(End_Session, SerialMacroArgCount(__VA_ARGS__))(__VA_ARGS__)
#define End_SessionF(...)
#define End_SessionA(...)
#define End_SessionM(...)
#define End_Session31(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session29(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session27(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session25(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session23(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session21(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session19(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session17(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session15(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session13(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session11(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session9(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session7(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session5(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))
#define End_Session3(...) END_SESSION(GET_VA_ARG_1(__VA_ARGS__))

//macro delay expand. unused now
//#define Expand(...)   _Expand1(_Expand1(_Expand1(__VA_ARGS__)))
//#define _Expand1(...) _Expand2(_Expand2(_Expand2(__VA_ARGS__)))
//#define _Expand2(...) _Expand3(_Expand3(_Expand3(__VA_ARGS__)))
//#define _Expand3(...) __VA_ARGS__



//main macro interface
#define SerialClass(...) _SerialFormat(__VA_ARGS__); _End_Session(__VA_ARGS__)




//process
#define _SerialFormat(...) SerialConcat(_SerialFormat, SerialMacroArgCount(__VA_ARGS__))(__VA_ARGS__)

//syntax check error msg
//appear in pairs
#define _SerialFormatF(...)                 First arg is class name, the following args must appear in pairs e.g: SerialClass(classname, int *, a, ...) 
//at least 3 args
#define _SerialFormatA(...)                 Macro SerialClass at least need 3 args 
//support 15 objects                                                                                                                           
#define _SerialFormatM(...)                 Currently SerialClass(...) only supports a maximum of 15 objects(31args)

//Recursive function bodies
#define _SerialFormat1(_0)                  BEGIN_SESSION
#define _SerialFormat2(_0, _1)              _SerialFormat1(_0)
#define _SerialFormat3(_0, _1, _2)          _SerialFormat2(_0, _1) BODY_SESSION(_1,_2)
#define _SerialFormat4(_0, _1, _2, _3)      _SerialFormat3(_0, _1, _2)
#define _SerialFormat5(_0, _1, _2, _3, _4)  _SerialFormat4(_0, _1, _2, _3) BODY_SESSION(_3, _4)
#define _SerialFormat6(_0, _1, _2, _3, _4, _5)  _SerialFormat5(_0, _1, _2, _3, _4) 
#define _SerialFormat7(_0, _1, _2, _3, _4, _5, _6)  _SerialFormat6(_0, _1, _2, _3, _4, _5) BODY_SESSION(_5, _6)
#define _SerialFormat8(_0, _1, _2, _3, _4, _5, _6, _7)  _SerialFormat7(_0, _1, _2, _3, _4, _5, _6) 
#define _SerialFormat9(_0, _1, _2, _3, _4, _5, _6, _7, _8)  _SerialFormat8(_0, _1, _2, _3, _4, _5, _6, _7) BODY_SESSION(_7, _8) 
#define _SerialFormat10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9)  _SerialFormat9(_0, _1, _2, _3, _4, _5, _6, _7, _8)
#define _SerialFormat11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10)  _SerialFormat10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) BODY_SESSION(_9, _10)
#define _SerialFormat12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11)  _SerialFormat11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) 
#define _SerialFormat13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12)  _SerialFormat12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11) BODY_SESSION(_11, _12)
#define _SerialFormat14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13)  _SerialFormat13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12) 
#define _SerialFormat15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14)  _SerialFormat14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13) BODY_SESSION(_13, _14) 
#define _SerialFormat16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15)  _SerialFormat15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14)
#define _SerialFormat17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16)  _SerialFormat16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15) BODY_SESSION(_15, _16)
#define _SerialFormat18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17)  _SerialFormat17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16)
#define _SerialFormat19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18)  _SerialFormat18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17) BODY_SESSION(_17, _18)
#define _SerialFormat20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19)  _SerialFormat19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18)
#define _SerialFormat21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20)  _SerialFormat20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19) BODY_SESSION(_19, _20)
#define _SerialFormat22(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21)  _SerialFormat21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19, _20) 
#define _SerialFormat23(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22)  _SerialFormat22(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) BODY_SESSION(_21, _22)
#define _SerialFormat24(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23)  _SerialFormat23(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22)
#define _SerialFormat25(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24)  _SerialFormat24(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) BODY_SESSION(_23, _24)
#define _SerialFormat26(_0, _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)  _SerialFormat25(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24)
#define _SerialFormat27(_0, _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)  _SerialFormat26(_0, _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) BODY_SESSION(_25, _26)
#define _SerialFormat28(_0, _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)  _SerialFormat27(_0, _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)
#define _SerialFormat29(_0, _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)  _SerialFormat28(_0, _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) BODY_SESSION(_27, _28)
#define _SerialFormat30(_0, _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)  _SerialFormat29(_0, _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) 
#define _SerialFormat31(_0, _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)  _SerialFormat30(_0, _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) BODY_SESSION(_29, _30) 


SerialClass(***,int *, a, float, b, char ****, c)