#include <iostream>
using namespace std;
template <typename F>
struct curry_impl {
F f;
curry_impl(F f) : f(f) {}
template <typename A>
struct inner {
F f; A a;
inner(F f, A a) : f(f), a(a) {}
template <typename B>
auto operator () (B b) -> decltype(f(a, b)) {
return f(a, b);
}
};
template <typename A>
auto operator () (A a) -> inner<A> {
return inner<A>(f, a);
}
};
template <typename F>
curry_impl<F> curry(F f) {
return curry_impl<F>(f);
}
int main() {
cout << curry([](int x, int y) { return x + y; })(21)(21) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CnN0cnVjdCBjdXJyeV9pbXBsIHsKICAgIEYgZjsKCWN1cnJ5X2ltcGwoRiBmKSA6IGYoZikge30KCXRlbXBsYXRlIDx0eXBlbmFtZSBBPgoJc3RydWN0IGlubmVyIHsKCQlGIGY7IEEgYTsKCQlpbm5lcihGIGYsIEEgYSkgOiBmKGYpLCBhKGEpIHt9CgkJdGVtcGxhdGUgPHR5cGVuYW1lIEI+CgkJYXV0byBvcGVyYXRvciAoKSAoQiBiKSAtPiBkZWNsdHlwZShmKGEsIGIpKSB7CgkJCXJldHVybiBmKGEsIGIpOwoJCX0KCX07Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgQT4KCWF1dG8gb3BlcmF0b3IgKCkgKEEgYSkgLT4gaW5uZXI8QT4gewoJCXJldHVybiBpbm5lcjxBPihmLCBhKTsKCX0KfTsKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CmN1cnJ5X2ltcGw8Rj4gY3VycnkoRiBmKSB7CglyZXR1cm4gY3VycnlfaW1wbDxGPihmKTsKfQoKaW50IG1haW4oKSB7CiAgICBjb3V0IDw8IGN1cnJ5KFtdKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCArIHk7IH0pKDIxKSgyMSkgPDwgZW5kbDsKfQ==