#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