#include <iostream>
#define EXPAND(x) x
#define FOR_EACH_2(what, delimiter, x, y) what((x), (y))
#define FOR_EACH_4(what, delimiter, x, y, ...)\
what((x), (y)) delimiter \
EXPAND(FOR_EACH_2(what, delimiter, __VA_ARGS__))
#define FOR_EACH_6(what, delimiter, x, y, ...)\
what((x), (y)) delimiter \
EXPAND(FOR_EACH_4(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, N, ...) N
#define FOR_EACH_RSEQ_N() 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__)
void foo(int x, float y) {
std::cout << "foo(" << x << ", " << y << ")\n";
}
int main() {
FOR_EACH(foo, ;, 1, 3.14, 2, 1.41, 3, 1.73);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBFWFBBTkQoeCkgeAojZGVmaW5lIEZPUl9FQUNIXzIod2hhdCwgZGVsaW1pdGVyLCB4LCB5KSB3aGF0KCh4KSwgKHkpKQojZGVmaW5lIEZPUl9FQUNIXzQod2hhdCwgZGVsaW1pdGVyLCB4LCB5LCAuLi4pXAogIHdoYXQoKHgpLCAoeSkpIGRlbGltaXRlciBcCiAgRVhQQU5EKEZPUl9FQUNIXzIod2hhdCwgZGVsaW1pdGVyLCBfX1ZBX0FSR1NfXykpCiNkZWZpbmUgRk9SX0VBQ0hfNih3aGF0LCBkZWxpbWl0ZXIsIHgsIHksIC4uLilcCiAgd2hhdCgoeCksICh5KSkgZGVsaW1pdGVyIFwKICBFWFBBTkQoRk9SX0VBQ0hfNCh3aGF0LCBkZWxpbWl0ZXIsIF9fVkFfQVJHU19fKSkKCiNkZWZpbmUgRk9SX0VBQ0hfTkFSRyguLi4pIEZPUl9FQUNIX05BUkdfKF9fVkFfQVJHU19fLCBGT1JfRUFDSF9SU0VRX04oKSkKI2RlZmluZSBGT1JfRUFDSF9OQVJHXyguLi4pIEVYUEFORChGT1JfRUFDSF9BUkdfTihfX1ZBX0FSR1NfXykpCiNkZWZpbmUgRk9SX0VBQ0hfQVJHX04oXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgTiwgLi4uKSBOCiNkZWZpbmUgRk9SX0VBQ0hfUlNFUV9OKCkgNiwgNSwgNCwgMywgMiwgMSwgMAojZGVmaW5lIENPTkNBVEVOQVRFKHgseSkgeCMjeQojZGVmaW5lIEZPUl9FQUNIXyhOLCB3aGF0LCBkZWxpbWl0ZXIsIC4uLikgRVhQQU5EKENPTkNBVEVOQVRFKEZPUl9FQUNIXywgTikod2hhdCwgZGVsaW1pdGVyLCBfX1ZBX0FSR1NfXykpCgojZGVmaW5lIEZPUl9FQUNIKHdoYXQsIGRlbGltaXRlciwgLi4uKSBGT1JfRUFDSF8oRk9SX0VBQ0hfTkFSRyhfX1ZBX0FSR1NfXyksIHdoYXQsIGRlbGltaXRlciwgX19WQV9BUkdTX18pCgp2b2lkIGZvbyhpbnQgeCwgZmxvYXQgeSkgewoJc3RkOjpjb3V0IDw8ICJmb28oIiA8PCB4IDw8ICIsICIgPDwgeSA8PCAiKVxuIjsKfQoKaW50IG1haW4oKSB7CglGT1JfRUFDSChmb28sIDssIDEsIDMuMTQsIDIsIDEuNDEsIDMsIDEuNzMpOwp9