#include <iostream>
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/
#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
#define F_1(a) functionBeingUsed(); a;
#define F_2(a, b) functionBeingUsed(a); b;
#define F_3(a, b, c) functionBeingUsed(a, b); c;
#define F_4(a, b, c, d) functionBeingUsed(a, b, c); d;
#define F_5(a, b, c, d, e) functionBeingUsed(a, b, c, d); e;
#define F_6(a, b, c, d, e, f) functionBeingUsed(a, b, c, d, e); f;
#define F_7(a, b, c, d, e, f, g) functionBeingUsed(a, b, c, d, e, f); g;
#define F_8(a, b, c, d, e, f, g, h) functionBeingUsed(a, b, c, d, e, f, g); h;
#define DISPATCH(N) F_ ## N
#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)
void functionBeingUsed(int a, int b, int c) { std::cout << "hello world 3\n"; }
void functionBeingUsed(int a, int b, int c, int d) { std::cout << "hello world 4\n"; }
int main() {
Macro(1,2,3,4, int i = 0);
Macro(1,2,3, int j = 0);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBDT1VOVF9OKF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgTiwgLi4uKSAgICBOCiNkZWZpbmUgQ09VTlQoLi4uKSAgIENPVU5UX04oX19WQV9BUkdTX18sIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxKQovLyBXYXJuaW5nOiBDT1VOVCgpIHJldHVybiAxIChhcyBDT1VOVChBKSkgOi0vCgojZGVmaW5lIElERU5USVRZKE4pIE4KI2RlZmluZSBBUFBMWShtYWNybywgLi4uKSBJREVOVElUWShtYWNybyhfX1ZBX0FSR1NfXykpCgojZGVmaW5lIEZfMShhKSBmdW5jdGlvbkJlaW5nVXNlZCgpOyBhOwojZGVmaW5lIEZfMihhLCBiKSBmdW5jdGlvbkJlaW5nVXNlZChhKTsgYjsKI2RlZmluZSBGXzMoYSwgYiwgYykgZnVuY3Rpb25CZWluZ1VzZWQoYSwgYik7IGM7CiNkZWZpbmUgRl80KGEsIGIsIGMsIGQpIGZ1bmN0aW9uQmVpbmdVc2VkKGEsIGIsIGMpOyBkOwojZGVmaW5lIEZfNShhLCBiLCBjLCBkLCBlKSBmdW5jdGlvbkJlaW5nVXNlZChhLCBiLCBjLCBkKTsgZTsKI2RlZmluZSBGXzYoYSwgYiwgYywgZCwgZSwgZikgZnVuY3Rpb25CZWluZ1VzZWQoYSwgYiwgYywgZCwgZSk7IGY7CiNkZWZpbmUgRl83KGEsIGIsIGMsIGQsIGUsIGYsIGcpIGZ1bmN0aW9uQmVpbmdVc2VkKGEsIGIsIGMsIGQsIGUsIGYpOyBnOwojZGVmaW5lIEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSBmdW5jdGlvbkJlaW5nVXNlZChhLCBiLCBjLCBkLCBlLCBmLCBnKTsgaDsKCiNkZWZpbmUgRElTUEFUQ0goTikgRl8gIyMgTgoKI2RlZmluZSBNYWNybyguLi4pIElERU5USVRZKEFQUExZKERJU1BBVENILCBDT1VOVChfX1ZBX0FSR1NfXykpKShfX1ZBX0FSR1NfXykKCnZvaWQgZnVuY3Rpb25CZWluZ1VzZWQoaW50IGEsIGludCBiLCBpbnQgYykgeyBzdGQ6OmNvdXQgPDwgImhlbGxvIHdvcmxkIDNcbiI7IH0Kdm9pZCBmdW5jdGlvbkJlaW5nVXNlZChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgeyBzdGQ6OmNvdXQgPDwgImhlbGxvIHdvcmxkIDRcbiI7IH0KCmludCBtYWluKCkgewogICAgTWFjcm8oMSwyLDMsNCwgaW50IGkgPSAwKTsKICAgIE1hY3JvKDEsMiwzLCBpbnQgaiA9IDApOwp9Cgo=