C++ preprocessor __VA_ARGS__ number of arguments

后端 未结 12 2234
一向
一向 2020-11-22 08:03

Simple question for which I could not find answer on the net. In variadic argument macros, how to find the number of arguments? I am okay with boost preprocessor, if it has

12条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 08:40

    With msvc extension:

    #define Y_TUPLE_SIZE(...) Y_TUPLE_SIZE_II((Y_TUPLE_SIZE_PREFIX_ ## __VA_ARGS__ ## _Y_TUPLE_SIZE_POSTFIX,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
    #define Y_TUPLE_SIZE_II(__args) Y_TUPLE_SIZE_I __args
    
    #define Y_TUPLE_SIZE_PREFIX__Y_TUPLE_SIZE_POSTFIX ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
    
    #define Y_TUPLE_SIZE_I(__p0,__p1,__p2,__p3,__p4,__p5,__p6,__p7,__p8,__p9,__p10,__p11,__p12,__p13,__p14,__p15,__p16,__p17,__p18,__p19,__p20,__p21,__p22,__p23,__p24,__p25,__p26,__p27,__p28,__p29,__p30,__p31,__n,...) __n
    

    Works for 0 - 32 arguments. This limit can be easily extended.

    EDIT: Simplified version (works in VS2015 14.0.25431.01 Update 3 & gcc 7.4.0) up to 100 arguments to copy & paste:

    #define COUNTOF(...) _COUNTOF_CAT( _COUNTOF_A, ( 0, ##__VA_ARGS__, 100,\
        99, 98, 97, 96, 95, 94, 93, 92, 91, 90,\
        89, 88, 87, 86, 85, 84, 83, 82, 81, 80,\
        79, 78, 77, 76, 75, 74, 73, 72, 71, 70,\
        69, 68, 67, 66, 65, 64, 63, 62, 61, 60,\
        59, 58, 57, 56, 55, 54, 53, 52, 51, 50,\
        49, 48, 47, 46, 45, 44, 43, 42, 41, 40,\
        39, 38, 37, 36, 35, 34, 33, 32, 31, 30,\
        29, 28, 27, 26, 25, 24, 23, 22, 21, 20,\
        19, 18, 17, 16, 15, 14, 13, 12, 11, 10,\
        9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ) )
    #define _COUNTOF_CAT( a, b ) a b
    #define _COUNTOF_A( a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,\
        a10, a11, a12, a13, a14, a15, a16, a17, a18, a19,\
        a20, a21, a22, a23, a24, a25, a26, a27, a28, a29,\
        a30, a31, a32, a33, a34, a35, a36, a37, a38, a39,\
        a40, a41, a42, a43, a44, a45, a46, a47, a48, a49,\
        a50, a51, a52, a53, a54, a55, a56, a57, a58, a59,\
        a60, a61, a62, a63, a64, a65, a66, a67, a68, a69,\
        a70, a71, a72, a73, a74, a75, a76, a77, a78, a79,\
        a80, a81, a82, a83, a84, a85, a86, a87, a88, a89,\
        a90, a91, a92, a93, a94, a95, a96, a97, a98, a99,\
        a100, n, ... ) n
    

提交回复
热议问题