#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;
}