#include <iostream>
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{
	void (led::*action)(); 
	led *ld; 
public: 
	auto_switch(void(led::*a)(), led*l) : action(a), ld(l) {}
	void go	() { (ld->*action)(); }
}; 
 
int led::nextid=0; 
 
int main() {
	led l1; 
	blinking_led l2; 
	l1.turn_on(); l1.turn_off(); 
	l2.blink(); 
	auto_switch s(&led::turn_off, &l1);
	s.go(); 
	auto_switch s2(&blinking_led::blink, &l2);
 
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgbGVkIHsKcHJpdmF0ZTogCglpbnQgaWQ7IAoJc3RhdGljIGludCBuZXh0aWQ7IApwdWJsaWM6ICAKICAgIGxlZCgpIHsgaWQ9KytuZXh0aWQ7IH0KICAgIGludCBnZXRfaWQoKSB7IHJldHVybiBpZDsgfQoJdm9pZCB0dXJuX29uKCkgeyBjb3V0PDwiVHVybiBvbiBsZWQgIjw8aWQ8PGVuZGw7IH0KCXZvaWQgdHVybl9vZmYoKSB7IGNvdXQ8PCJUdXJuIG9mZiBsZWQgIjw8aWQ8PGVuZGw7IH0KfTsKY2xhc3MgYmxpbmtpbmdfbGVkIDogcHVibGljIGxlZCB7CnB1YmxpYzoKCXZvaWQgYmxpbmsoKSB7IGNvdXQ8PCJCbGluayAiPDxnZXRfaWQoKTw8ZW5kbDsgY291dDw8IiAgLT4iOyB0dXJuX29uKCk7Y291dDw8IiAgLT4iOyB0dXJuX29mZigpO30KfTsKY2xhc3MgYXV0b19zd2l0Y2h7Cgl2b2lkIChsZWQ6OiphY3Rpb24pKCk7IAoJbGVkICpsZDsgCnB1YmxpYzogCglhdXRvX3N3aXRjaCh2b2lkKGxlZDo6KmEpKCksIGxlZCpsKSA6IGFjdGlvbihhKSwgbGQobCkge30KCXZvaWQgZ28JKCkgeyAobGQtPiphY3Rpb24pKCk7IH0KfTsgCgppbnQgbGVkOjpuZXh0aWQ9MDsgCgppbnQgbWFpbigpIHsKCWxlZCBsMTsgCglibGlua2luZ19sZWQgbDI7IAoJbDEudHVybl9vbigpOyBsMS50dXJuX29mZigpOyAKCWwyLmJsaW5rKCk7IAoJYXV0b19zd2l0Y2ggcygmbGVkOjp0dXJuX29mZiwgJmwxKTsKCXMuZ28oKTsgCglhdXRvX3N3aXRjaCBzMigmYmxpbmtpbmdfbGVkOjpibGluaywgJmwyKTsKCQoJcmV0dXJuIDA7Cn0=
				
				
				
				
				
			 
			
				
			
			
				
	
		
	
	
	prog.cpp: In function ‘int main()’:
prog.cpp:35:42: error: no matching function for call to ‘auto_switch::auto_switch(void (blinking_led::*)(), blinking_led*)’
  auto_switch s2(&blinking_led::blink, &l2);
                                          ^
prog.cpp:22:2: note: candidate: ‘auto_switch::auto_switch(void (led::*)(), led*)’
  auto_switch(void(led::*a)(), led*l) : action(a), ld(l) {}
  ^~~~~~~~~~~
prog.cpp:22:2: note:   no known conversion for argument 1 from ‘void (blinking_led::*)()’ to ‘void (led::*)()’
prog.cpp:18:7: note: candidate: ‘constexpr auto_switch::auto_switch(const auto_switch&)’
 class auto_switch{
       ^~~~~~~~~~~
prog.cpp:18:7: note:   candidate expects 1 argument, 2 provided
prog.cpp:18:7: note: candidate: ‘constexpr auto_switch::auto_switch(auto_switch&&)’
prog.cpp:18:7: note:   candidate expects 1 argument, 2 provided