#include <iostream>
#include <functional>
template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
struct my_lambda : std::binary_function<Arg1, Arg2, void>
{
my_lambda(const Cap1& c1, const Cap2& c2) : cap1(c1), cap2(c2) {}
void operator()(const Arg1& arg1, const Arg2& arg2) const
{
// lambda body
std::cout << (cap1 + cap2 + arg1 + arg2) << std::endl;
}
mutable Cap1 cap1;
mutable Cap2 cap2;
};
template <typename Arg1, typename Arg2, typename Cap1, typename Cap2>
my_lambda<Arg1, Arg2, Cap1, Cap2> lambda(const Cap1& c1, const Cap2& c2)
{
return my_lambda<Arg1, Arg2, Cap1, Cap2>(c1, c2);
}
int main()
{
int i = 1, j = 2;
lambda<int, int>(i, j)(3, 4);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBDYXAxLCB0eXBlbmFtZSBDYXAyPgpzdHJ1Y3QgbXlfbGFtYmRhIDogc3RkOjpiaW5hcnlfZnVuY3Rpb248QXJnMSwgQXJnMiwgdm9pZD4KewogICAgbXlfbGFtYmRhKGNvbnN0IENhcDEmIGMxLCBjb25zdCBDYXAyJiBjMikgOiBjYXAxKGMxKSwgY2FwMihjMikge30KCiAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikgY29uc3QKICAgIHsKICAgICAgICAvLyBsYW1iZGEgYm9keQogICAgICAgIHN0ZDo6Y291dCA8PCAoY2FwMSArIGNhcDIgKyBhcmcxICsgYXJnMikgPDwgc3RkOjplbmRsOwogICAgfQoKICAgIG11dGFibGUgQ2FwMSBjYXAxOwogICAgbXV0YWJsZSBDYXAyIGNhcDI7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQ2FwMSwgdHlwZW5hbWUgQ2FwMj4KbXlfbGFtYmRhPEFyZzEsIEFyZzIsIENhcDEsIENhcDI+IGxhbWJkYShjb25zdCBDYXAxJiBjMSwgY29uc3QgQ2FwMiYgYzIpCnsKICAgIHJldHVybiBteV9sYW1iZGE8QXJnMSwgQXJnMiwgQ2FwMSwgQ2FwMj4oYzEsIGMyKTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgaSA9IDEsIGogPSAyOwogICAgbGFtYmRhPGludCwgaW50PihpLCBqKSgzLCA0KTsKfQo=