#include <iostream>
#include <functional>
using namespace std;
class Inner
{
int myx;
public :
Inner( int x) ; // this represents the capture of the lambda
int operator( ) ( int k) ; // this is the function of adding k to the catpture
} ;
Inner:: Inner ( int x)
{
myx = x;
}
int Inner:: operator ( ) ( int k)
{
cout << "Class Inner arg:" << k<< " with a capture of " << myx<< endl;
return myx + k;
}
class Suma
{
public :
Inner operator( ) ( int x) ;
} ;
Inner Suma:: operator ( ) ( int x)
{
cout << "Class Suma is the function " << x<< "+ something" << endl;
return Inner( x) ;
} ;
int main( ) {
auto lsuma = [ ] ( int x) - > function< int ( int ) > // lsuma is a local lambda
{
cout << "Suma lambda is the function " << x<< "+ something" << endl;
return [ x] ( int y)
{
cout << "inner lambda arg:" << y<< " with a capture of " << x<< endl;
return x+ y;
} ;
} ;
Suma f; // f is also a local, but an object
cout << lsuma( 3 ) ( 2 ) << endl;
cout << f( 3 ) ( 2 ) << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICAgICAgY2xhc3MgSW5uZXIKICAgICAgICB7CiAgICAgICAgICAgIGludCBteXg7IAogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgSW5uZXIoaW50IHgpOyAgICAvLyB0aGlzIHJlcHJlc2VudHMgdGhlIGNhcHR1cmUgb2YgdGhlIGxhbWJkYQogICAgICAgICAgICBpbnQgb3BlcmF0b3IoKShpbnQgayk7ICAvLyB0aGlzIGlzIHRoZSBmdW5jdGlvbiBvZiBhZGRpbmcgayB0byB0aGUgY2F0cHR1cmUKICAgICAgICB9OwoKICAgICAgICBJbm5lcjo6SW5uZXIoaW50IHgpIAogICAgICAgIHsKICAgICAgICAgICAgbXl4ID0geDsgCiAgICAgICAgfQogICAgICAgIGludCBJbm5lcjo6b3BlcmF0b3IoKShpbnQgaykKICAgICAgICB7CiAgICAgICAgIAljb3V0IDw8ICJDbGFzcyBJbm5lciBhcmc6IiA8PGs8PCIgd2l0aCBhIGNhcHR1cmUgb2YgIjw8bXl4PDxlbmRsOyAKICAgICAgICAgICAgcmV0dXJuIG15eCArIGs7CiAgICAgICAgfQoKICAgICAgICBjbGFzcyBTdW1hCiAgICAgICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgSW5uZXIgb3BlcmF0b3IoKShpbnQgeCk7CiAgICAgICAgfTsKIAogICAgICAgIElubmVyIFN1bWE6Om9wZXJhdG9yKCkoaW50IHgpIAogICAgICAgIHsKICAgICAgIAkgICAgIGNvdXQ8PCJDbGFzcyBTdW1hIGlzIHRoZSBmdW5jdGlvbiAiPDx4PDwiKyBzb21ldGhpbmciPDxlbmRsOwogICAgICAgICAgICAgcmV0dXJuIElubmVyKHgpOyAKICAgICAgICB9OwogCgppbnQgbWFpbigpIHsKCQoJYXV0byBsc3VtYSA9IFtdKGludCB4KS0+ZnVuY3Rpb248aW50KGludCk+ICAgLy8gbHN1bWEgaXMgYSBsb2NhbCBsYW1iZGEKICAgIHsKICAgIAljb3V0PDwiU3VtYSBsYW1iZGEgaXMgdGhlIGZ1bmN0aW9uICI8PHg8PCIrIHNvbWV0aGluZyI8PGVuZGw7CiAgICAgICAgcmV0dXJuIFt4XShpbnQgeSkKICAgICAgICB7CiAgICAgICAgCWNvdXQgPDwgImlubmVyIGxhbWJkYSBhcmc6IiA8PHk8PCIgd2l0aCBhIGNhcHR1cmUgb2YgIjw8eDw8ZW5kbDsgCiAgICAgICAgICAgIHJldHVybiB4K3k7CiAgICAgICAgfTsKICAgIH07CiAgICAKIAogICAgU3VtYSBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmIGlzIGFsc28gYSBsb2NhbCwgYnV0IGFuIG9iamVjdCAKICAgIGNvdXQgPDwgbHN1bWEoMykoMikgPDxlbmRsOyAKICAgIGNvdXQgPDwgZigzKSgyKTw8ZW5kbDsgCiAKCXJldHVybiAwOwp9