#include <iostream>
#include <functional>
using namespace std;
typedef int value;
template<class Signature>
function<void(int, value[])>
thunk( function<Signature> f );
template<class R, class Arg1>
function<void(int, value[])>
thunk( function<R(Arg1)> f )
{
return [f](int, value v[]) -> R
{
return f(v[0]);
};
}
template<class R, class Arg1, class Arg2>
function<void(int, value[])>
thunk( function<R(Arg1, Arg2)> f )
{
return [f](int, value v[]) -> R
{
return f(v[0], v[1]);
};
}
void f1(int p1) { cout << "f1\t" << p1 << "\n"; }
void f2(int p1, int p2) { cout << "f2\t" << p1 << "\t" << p2 << "\n"; }
int main() {
int a1[] = {1};
int a2[] = {3, 4};
thunk( std::function<void(int)>(f1) )(1, a1);
thunk( std::function<void(int, int)>(f2) )(2, a2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGludCB2YWx1ZTsKCnRlbXBsYXRlPGNsYXNzIFNpZ25hdHVyZT4KZnVuY3Rpb248dm9pZChpbnQsIHZhbHVlW10pPgp0aHVuayggZnVuY3Rpb248U2lnbmF0dXJlPiBmICk7CgoKdGVtcGxhdGU8Y2xhc3MgUiwgY2xhc3MgQXJnMT4KZnVuY3Rpb248dm9pZChpbnQsIHZhbHVlW10pPgp0aHVuayggZnVuY3Rpb248UihBcmcxKT4gZiApCnsKCXJldHVybiBbZl0oaW50LCB2YWx1ZSB2W10pIC0+IFIKCXsKCQlyZXR1cm4gZih2WzBdKTsKCX07Cn0KCgp0ZW1wbGF0ZTxjbGFzcyBSLCBjbGFzcyBBcmcxLCBjbGFzcyBBcmcyPgpmdW5jdGlvbjx2b2lkKGludCwgdmFsdWVbXSk+CnRodW5rKCBmdW5jdGlvbjxSKEFyZzEsIEFyZzIpPiBmICkKewoJcmV0dXJuIFtmXShpbnQsIHZhbHVlIHZbXSkgLT4gUgoJewoJCXJldHVybiBmKHZbMF0sIHZbMV0pOwoJfTsKfQoKCnZvaWQgZjEoaW50IHAxKSB7IGNvdXQgPDwgImYxXHQiIDw8IHAxIDw8ICJcbiI7IH0Kdm9pZCBmMihpbnQgcDEsIGludCBwMikgeyBjb3V0IDw8ICJmMlx0IiA8PCBwMSA8PCAiXHQiIDw8IHAyIDw8ICJcbiI7IH0KCmludCBtYWluKCkgewoJaW50IGExW10gPSB7MX07CglpbnQgYTJbXSA9IHszLCA0fTsKCXRodW5rKCBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4oZjEpICkoMSwgYTEpOwoJdGh1bmsoIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQsIGludCk+KGYyKSApKDIsIGEyKTsKCXJldHVybiAwOwp9