for-loopsをシミュレートしてコピーと貼り付けコードを排除するC++マクロコードです。FOR_EACHマクロ(呼び出しマクロ内に2つ以上のパラメータがある)
#define SEMICOLON ;
#define LOL(x) print(x)
#define LOLZ(...) FOR_EACH(LOL, SEMICOLON, ##__VA_ARGS__)
LOLZ("hi", "my", "friend", "!");
// result
print("hi"); print("my"); print("friend"); print("!");
そしてまた、私は、このマクロを作成するためのコードを表示することができます(私はこのhere on Stack Overflowを見つけた):
#define EXPAND(x) x
#define FOR_EACH_1(what, delimiter, x, ...) what(x)
#define FOR_EACH_2(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_1(what, delimiter, __VA_ARGS__))
#define FOR_EACH_3(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_2(what, delimiter, __VA_ARGS__))
#define FOR_EACH_4(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_3(what, delimiter, __VA_ARGS__))
#define FOR_EACH_5(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_4(what, delimiter, __VA_ARGS__))
#define FOR_EACH_6(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_5(what, delimiter, __VA_ARGS__))
#define FOR_EACH_7(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_6(what, delimiter, __VA_ARGS__))
#define FOR_EACH_8(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_7(what, delimiter, __VA_ARGS__))
#define FOR_EACH_9(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_8(what, delimiter, __VA_ARGS__))
#define FOR_EACH_10(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_9(what, delimiter, __VA_ARGS__))
#define FOR_EACH_11(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_10(what, delimiter, __VA_ARGS__))
#define FOR_EACH_12(what, delimiter, x, ...)\
what(x) delimiter\
EXPAND(FOR_EACH_11(what, delimiter, __VA_ARGS__))
#define FOR_EACH_13(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_12(what, delimiter, __VA_ARGS__))
#define FOR_EACH_14(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_13(what, delimiter, __VA_ARGS__))
#define FOR_EACH_15(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_14(what, delimiter, __VA_ARGS__))
#define FOR_EACH_16(what, delimiter, x, ...)\
what(x) delimiter \
EXPAND(FOR_EACH_15(what, delimiter, __VA_ARGS__))
#define FOR_EACH_NARG(...) FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())
#define FOR_EACH_NARG_(...) EXPAND(FOR_EACH_ARG_N(__VA_ARGS__))
#define FOR_EACH_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, N, ...) N
#define FOR_EACH_RSEQ_N() 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
#define CONCATENATE(x,y) x##y
#define FOR_EACH_(N, what, delimiter, ...) EXPAND(CONCATENATE(FOR_EACH_, N)(what, delimiter, __VA_ARGS__))
#define FOR_EACH(what, delimiter, ...) FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, delimiter, __VA_ARGS__)
しかし、私は機能のための2つの引数を持つ難しあります を私はFUNC(Xを使用する必要があります、y)を返します。
func(x1, y1); func(x2, y2); func(x3, y3); func(,); func(,); func(,);
場合:私は、私が「何を」引数を呼び出すのX2 unsed置換を得ただろうマクロで「×」引数の近くに「y」を追加した場合
MY_DUAL_FOREACH_LIKE_MACRO(
x1, y1,
x2, y2,
x3, y3
)
// and I expect to get:
func(x1, y1); func(x2, y2); func(x3, y3);
: 呼び出すマクロは次のようになりますなければなりませんあなたはこれを経験しています。私はこのマクロをデュアル引数型FOR_EACHマクロにコード化するのを手伝ってください。
私はこれを行うことをお勧めしません。どのような問題を解決しようとしていますか?構造内のデータを表現し、それを反復することでそれを解決できますか? – TartanLlama
マクロは悪です。私はそのようなコードを決してデバッグしないことを望む。 Btw。この「二重」反復は、zip iteratorと呼ばれ、ブーストライブラリにあります。 – Radek
"答えの1つでスタックのオーバーフローでこれが見つかりました"ソースにリンクしてください。 –