Last active
March 28, 2024 18:33
-
-
Save niXman/afba9d1812d89c0f985fdd5218b3354a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define SOME_PREFIX__CAT_I(a, b) a ## b | |
#define SOME_PREFIX__CAT(a, b) SOME_PREFIX__CAT_I(a, b) | |
#define SOME_PREFIX__ARG_N( \ | |
_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, \ | |
_51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ | |
_61,_62,_63,N,...) N | |
#define SOME_PREFIX__RSEQ_N() \ | |
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 SOME_PREFIX__NARG_IMPL(...) SOME_PREFIX__ARG_N(__VA_ARGS__) | |
#define SOME_PREFIX__NARG(...) SOME_PREFIX__NARG_IMPL(__VA_ARGS__, SOME_PREFIX__RSEQ_N()) | |
#define SOME_PREFIX__ENUM_ARGS_0(macro, data) | |
#define SOME_PREFIX__ENUM_ARGS_1(macro, data, _1) macro(data, _1) | |
#define SOME_PREFIX__ENUM_ARGS_2(macro, data, _1, _2) \ | |
SOME_PREFIX__ENUM_ARGS_1(macro, data, _1) SOME_PREFIX__ENUM_ARGS_1(macro, data, _2) | |
#define SOME_PREFIX__ENUM_ARGS_3(macro, data, _1, _2, _3) \ | |
SOME_PREFIX__ENUM_ARGS_2(macro, data, _1, _2) SOME_PREFIX__ENUM_ARGS_1(macro, data, _3) | |
#define SOME_PREFIX__ENUM_ARGS_4(macro, data, _1, _2, _3, _4) \ | |
SOME_PREFIX__ENUM_ARGS_3(macro, data, _1, _2, _3) SOME_PREFIX__ENUM_ARGS_1(macro, data, _4) | |
#define SOME_PREFIX__ENUM_ARGS_5(macro, data, _1, _2, _3, _4, _5) \ | |
SOME_PREFIX__ENUM_ARGS_4(macro, data, _1, _2, _3, _4) SOME_PREFIX__ENUM_ARGS_1(macro, data, _5) | |
#define SOME_PREFIX__ENUM_ARGS_6(macro, data, _1, _2, _3, _4, _5, _6) \ | |
SOME_PREFIX__ENUM_ARGS_5(macro, data, _1, _2, _3, _4, _5) SOME_PREFIX__ENUM_ARGS_1(macro, data, _6) | |
#define SOME_PREFIX__ENUM_ARGS_7(macro, data, _1, _2, _3, _4, _5, _6, _7) \ | |
SOME_PREFIX__ENUM_ARGS_6(macro, data, _1, _2, _3, _4, _5, _6) SOME_PREFIX__ENUM_ARGS_1(macro, data, _7) | |
#define SOME_PREFIX__ENUM_ARGS_8(macro, data, _1, _2, _3, _4, _5, _6, _7, _8) \ | |
SOME_PREFIX__ENUM_ARGS_7(macro, data, _1, _2, _3, _4, _5, _6, _7) SOME_PREFIX__ENUM_ARGS_1(macro, data, _8) | |
#define SOME_PREFIX__ENUM_ARGS_9(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ | |
SOME_PREFIX__ENUM_ARGS_8(macro, data, _1, _2, _3, _4, _5, _6, _7, _8) SOME_PREFIX__ENUM_ARGS_1(macro, data, _9) | |
#define SOME_PREFIX__ENUM_ARGS_10(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ | |
SOME_PREFIX__ENUM_ARGS_9(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9) SOME_PREFIX__ENUM_ARGS_1(macro, data, _10) | |
#define SOME_PREFIX__ENUM_ARGS_11(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ | |
SOME_PREFIX__ENUM_ARGS_10(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) SOME_PREFIX__ENUM_ARGS_1(macro, data, _11) | |
#define SOME_PREFIX__ENUM_ARGS_12(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ | |
SOME_PREFIX__ENUM_ARGS_11(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) SOME_PREFIX__ENUM_ARGS_1(macro, data, _12) | |
#define SOME_PREFIX__ENUM_ARGS_13(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ | |
SOME_PREFIX__ENUM_ARGS_12(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) SOME_PREFIX__ENUM_ARGS_1(macro, data, _13) | |
#define SOME_PREFIX__ENUM_ARGS_14(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ | |
SOME_PREFIX__ENUM_ARGS_13(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) SOME_PREFIX__ENUM_ARGS_1(macro, data, _14) | |
#define SOME_PREFIX__ENUM_ARGS_15(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ | |
SOME_PREFIX__ENUM_ARGS_14(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) SOME_PREFIX__ENUM_ARGS_1(macro, data, _15) | |
#define SOME_PREFIX__ENUM_ARGS_16(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ | |
SOME_PREFIX__ENUM_ARGS_15(macro, data, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) SOME_PREFIX__ENUM_ARGS_1(macro, data, _16) | |
#define SOME_PREFIX__ENUM_ARGS_IMPL(macro, data, n, ...) \ | |
SOME_PREFIX__CAT(SOME_PREFIX__ENUM_ARGS_, n)(macro, data, __VA_ARGS__) | |
#define SOME_PREFIX__ENUM_ARGS(macro, data, ...) \ | |
SOME_PREFIX__ENUM_ARGS_IMPL(macro, data, SOME_PREFIX__NARG(__VA_ARGS__), __VA_ARGS__) | |
/*************************************************************************************************/ | |
// test | |
#include <iostream> | |
#include <functional> | |
#define MY_ENUM_MACRO_FUNC(userdata, elem) \ | |
[m = userdata elem](const mystruct *s, std::ostream &os){ os << #elem << ": " << (s->*m) << std::endl;}, | |
struct mystruct { | |
int a=0; | |
short b=1; | |
long c=2; | |
float f=3; | |
double d=4; | |
}; | |
int main() { | |
static const std::function<void(const mystruct *, std::ostream &)> funcs[] = { | |
SOME_PREFIX__ENUM_ARGS(MY_ENUM_MACRO_FUNC, &mystruct::, a, b, c, f, d) | |
}; | |
const mystruct str; | |
for ( const auto &it: funcs ) | |
it(&str, std::cout); | |
} | |
// a: 0 | |
// b: 1 | |
// c: 2 | |
// f: 3 | |
// d: 4 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment