美文网首页大刘的 iOS 自学笔记
RAC宏分析6:metamacro_at

RAC宏分析6:metamacro_at

作者: 大刘 | 来源:发表于2017-07-05 14:10 被阅读32次
    /**
     * Returns the Nth variadic argument (starting from zero). At least
     * N + 1 variadic arguments must be given. N must be between zero and twenty,
     * inclusive.
     */
    #define metamacro_at(N, ...) \
            metamacro_concat(metamacro_at, N)(__VA_ARGS__)
    释义:变成 metamacro_atN(__VA_ARGS__)并返回可变参中第N个(从0开始)参数
    

    示例:metamacro_at(3, a, b, c, 3, 2, 1) 即变成: metamacro_at3(a, b, c, 3, 2, 1) 并返回第3个参数(从0开始):3
    NSLog(@"%d", metamacro_at3(a, b, c, 3, 2, 1)); // 3

    // metamacro_at expansions
    #define metamacro_at0(...) metamacro_head(__VA_ARGS__)
    #define metamacro_at1(_0, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at2(_0, _1, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at3(_0, _1, _2, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at4(_0, _1, _2, _3, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at5(_0, _1, _2, _3, _4, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at6(_0, _1, _2, _3, _4, _5, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at7(_0, _1, _2, _3, _4, _5, _6, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at8(_0, _1, _2, _3, _4, _5, _6, _7, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at9(_0, _1, _2, _3, _4, _5, _6, _7, _8, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, ...) metamacro_head(__VA_ARGS__)
    #define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(__VA_ARGS__)
    

    通过这个宏可以很方便的看下面的宏:
    metamacro_dec(VAL)和 metamacro_inc(VAL)
    这两个宏是一对。它们在元编程中,处理计数和index方面及其有用。VAL的值域都是[0,20]。

    /**
     * Decrements VAL, which must be a number between zero and twenty, inclusive.
     *
     * This is primarily useful when dealing with indexes and counts in
     * metaprogramming.
     */
    #define metamacro_dec(VAL) \
            metamacro_at(VAL, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
    

    释义:取值VAL-1

    /**
     * Increments VAL, which must be a number between zero and twenty, inclusive.
     *
     * This is primarily useful when dealing with indexes and counts in
     * metaprogramming.
     */
    #define metamacro_inc(VAL) \
            metamacro_at(VAL, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)
    

    释义:取值VAL+1

    相关文章

      网友评论

        本文标题:RAC宏分析6:metamacro_at

        本文链接:https://www.haomeiwen.com/subject/uykqhxtx.html