1. 程式人生 > >巨集超程式設計——技術——變參巨集

巨集超程式設計——技術——變參巨集

獲取變引數巨集的個數

#define TL_VARIADIC_SIZE(...) TL_CAT(TL_VARIADIC_SIZE_I(__VA_ARGS__, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)
#define TL_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, size, ...) size

說明:__VA_ARGS__和長度列表生成一個新的呼叫列表,然後再呼叫TL_VARIADIC_SIZE_I,具體的長度值就會被“擠”到size引數裡

獲取變引數巨集的第n個引數

#define TL_VARIADIC_ELEM(n, ...)

思路,可以通過TL_CAT把TL_VARIADIC_ELEM(n,...)對映成到一堆TL_VARIADIC_ELEM_n,再在TL_VARIADIC_ELEM_n裡獲取第n個元素e

#define TL_VARIADIC_ELEM(n, ...) TL_CAT(TL_VARIADIC_ELEM_##n,(__VA_ARGS__))

#define TL_VARIADIC_ELEM_0(e0, ...) e0
#define TL_VARIADIC_ELEM_1(e0,e1, ...) e1
#define TL_VARIADIC_ELEM_2(e0,e1,e2, ...) e2
#define TL_VARIADIC_ELEM_3(e0,e1,e2,e3, ...) e3
#define TL_VARIADIC_ELEM_4(e0,e1,e2,e3,e4, ...) e4
#define TL_VARIADIC_ELEM_5(e0,e1,e2,e3,e4,e5, ...) e5
#define TL_VARIADIC_ELEM_6(e0,e1,e2,e3,e4,e5,e6, ...) e6
#define TL_VARIADIC_ELEM_7(e0,e1,e2,e3,e4,e5,e6,e7, ...) e7
#define TL_VARIADIC_ELEM_8(e0,e1,e2,e3,e4,e5,e6,e7,e8, ...) e8
#define TL_VARIADIC_ELEM_9(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9 ...) e9

ps:如果把TL_VARIADIC_ELEM定義成

#define TL_VARIADIC_ELEM(n, ...) TL_VARIADIC_ELEM_##n(__VA_ARGS__)

下面的呼叫TL_VARIADIC_ELEM(3, 1,2,3,4,5)會報錯。

not enough actual parameters for macro 'TL_VARIADIC_ELEM_3'

主要原因是呼叫TL_VARIADIC_ELEM_3巨集的時候,把後面__VA_ARGS__當成一個整體引數了。通過使用TL_CAT它會它兩邊的結果拼接後再試著重新解析。