#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, "!");
}
