# 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)