#include <functional>
#include <iostream>
void apply(std::function<void()> f, int) {
f();
}
template <typename Head, typename ...Tail>
void apply(std::function<void(Head, Tail...)> f, int i=0) {
auto g = [=](Tail&& ...args){
f(i, std::forward<Tail>(args)...);
};
apply(std::function<void(Tail...)>{g}, ++i);
}
void foo(int a, int b, int c, int d) {
std::cout << a << b << c << d << "\n";
}
int main() {
auto f = std::function<void(int,int,int,int)>(foo);
apply(f);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnZvaWQgYXBwbHkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGYsIGludCkgewogIGYoKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lIC4uLlRhaWw+CnZvaWQgYXBwbHkoc3RkOjpmdW5jdGlvbjx2b2lkKEhlYWQsIFRhaWwuLi4pPiBmLCBpbnQgaT0wKSB7CiAgYXV0byBnID0gWz1dKFRhaWwmJiAuLi5hcmdzKXsKICAgIGYoaSwgc3RkOjpmb3J3YXJkPFRhaWw+KGFyZ3MpLi4uKTsKICB9OwoKICBhcHBseShzdGQ6OmZ1bmN0aW9uPHZvaWQoVGFpbC4uLik+e2d9LCArK2kpOwp9Cgp2b2lkIGZvbyhpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgewogIHN0ZDo6Y291dCA8PCBhIDw8IGIgPDwgYyA8PCBkIDw8ICJcbiI7Cn0KCmludCBtYWluKCkgewogIGF1dG8gZiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsaW50LGludCxpbnQpPihmb28pOwogIGFwcGx5KGYpOwp9Cg==