#include <iostream>
#include <functional>
using namespace std;
class led {
private:
int id;
static int nextid;
public:
led() { id=++nextid; }
int get_id() { return id; }
void turn_on() { cout<<"Turn on led "<<id<<endl; }
void turn_off() { cout<<"Turn off led "<<id<<endl; }
};
class blinking_led : public led {
public:
void blink() { cout<<"Blink "<<get_id()<<endl; cout<<" ->"; turn_on();cout<<" ->"; turn_off();}
};
class auto_switch{
std::function<void()> action;
public:
auto_switch(function<void()>a) : action(a) {}
void go () { action(); }
};
int led::nextid=0;
int main() {
led l1;
blinking_led l2;
l1.turn_on(); l1.turn_off();
l2.blink();
auto_switch s(bind(&led::turn_off, l1));
s.go();
auto_switch s2(bind(&blinking_led::blink, l2));
s2.go();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIGxlZCB7CnByaXZhdGU6IAoJaW50IGlkOyAKCXN0YXRpYyBpbnQgbmV4dGlkOyAKcHVibGljOiAgCiAgICBsZWQoKSB7IGlkPSsrbmV4dGlkOyB9CiAgICBpbnQgZ2V0X2lkKCkgeyByZXR1cm4gaWQ7IH0KCXZvaWQgdHVybl9vbigpIHsgY291dDw8IlR1cm4gb24gbGVkICI8PGlkPDxlbmRsOyB9Cgl2b2lkIHR1cm5fb2ZmKCkgeyBjb3V0PDwiVHVybiBvZmYgbGVkICI8PGlkPDxlbmRsOyB9Cn07CmNsYXNzIGJsaW5raW5nX2xlZCA6IHB1YmxpYyBsZWQgewpwdWJsaWM6Cgl2b2lkIGJsaW5rKCkgeyBjb3V0PDwiQmxpbmsgIjw8Z2V0X2lkKCk8PGVuZGw7IGNvdXQ8PCIgIC0+IjsgdHVybl9vbigpO2NvdXQ8PCIgIC0+IjsgdHVybl9vZmYoKTt9Cn07CmNsYXNzIGF1dG9fc3dpdGNoewoJc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGFjdGlvbjsgCnB1YmxpYzogCglhdXRvX3N3aXRjaChmdW5jdGlvbjx2b2lkKCk+YSkgOiBhY3Rpb24oYSkge30KCXZvaWQgZ28JKCkgeyBhY3Rpb24oKTsgfQp9OyAKCmludCBsZWQ6Om5leHRpZD0wOyAKCmludCBtYWluKCkgewoJbGVkIGwxOyAKCWJsaW5raW5nX2xlZCBsMjsgCglsMS50dXJuX29uKCk7IGwxLnR1cm5fb2ZmKCk7IAoJbDIuYmxpbmsoKTsgCglhdXRvX3N3aXRjaCBzKGJpbmQoJmxlZDo6dHVybl9vZmYsIGwxKSk7CglzLmdvKCk7IAoJYXV0b19zd2l0Y2ggczIoYmluZCgmYmxpbmtpbmdfbGVkOjpibGluaywgbDIpKTsKCXMyLmdvKCk7IAoJCglyZXR1cm4gMDsKfQ==