#include<functional>
#define F(R, ...) std::function<R(__VA_ARGS__)>
#define FuncType(N, R, ...) FUNC_##N(R, __VA_ARGS__)
#define FUNC_0(R, ...) F(R)
#define FUNC_1(R, _1, ...) F(R, _1)
#define FUNC_2(R, _1, _2, ...) F(R, _1, _2)
#define FUNC_3(R, _1, _2, _3, ...) F(R, _1, _2, _3)
int main() {
static_assert(std::is_same<
FuncType(2, void, int, char, double, int), // <--- see usage
std::function<void(int, char)>
>::value, "!");
}
I2luY2x1ZGU8ZnVuY3Rpb25hbD4KCiNkZWZpbmUgRihSLCAuLi4pIHN0ZDo6ZnVuY3Rpb248UihfX1ZBX0FSR1NfXyk+CiNkZWZpbmUgRnVuY1R5cGUoTiwgUiwgLi4uKSBGVU5DXyMjTihSLCBfX1ZBX0FSR1NfXykKI2RlZmluZSBGVU5DXzAoUiwgLi4uKSBGKFIpCiNkZWZpbmUgRlVOQ18xKFIsIF8xLCAuLi4pIEYoUiwgXzEpCiNkZWZpbmUgRlVOQ18yKFIsIF8xLCBfMiwgLi4uKSBGKFIsIF8xLCBfMikKI2RlZmluZSBGVU5DXzMoUiwgXzEsIF8yLCBfMywgLi4uKSBGKFIsIF8xLCBfMiwgXzMpCgppbnQgbWFpbigpIHsKICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPAogICAgICBGdW5jVHlwZSgyLCB2b2lkLCBpbnQsIGNoYXIsIGRvdWJsZSwgaW50KSwgIC8vIDwtLS0gc2VlIHVzYWdlCiAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsIGNoYXIpPgogICAgICA+Ojp2YWx1ZSwgIiEiKTsKfQo=