#include <iostream>
#include <memory>
#include <vector>
#include <functional>
using namespace std;
class Strategy;
struct ScheduledEvent {
function<void(Strategy*)> tocall;
void perform(Strategy*u) { tocall(u); }
ScheduledEvent(function<void(Strategy*)> func) : tocall(func) { }
};
class Strategy {
vector<unique_ptr<ScheduledEvent>> heap_eventlist;
public:
void schedule_function(function<void(Strategy*)> func) {
// Puts the scheduled event built with the strategy function onto a list
heap_eventlist.emplace_back(std::make_unique<ScheduledEvent>(func));
}
void do_it() {
for (auto &x:heap_eventlist)
x->perform(this);
}
virtual void f() { cout <<"Strategy"<<endl; }
};
struct BasicAlgo : Strategy {
string b="BasicAlgo";
void ff() { cout << b<<endl; }
};
int main() {
BasicAlgo g;
g.schedule_function (&BasicAlgo::f);
g.schedule_function ([](Strategy *x)->void { BasicAlgo*b=dynamic_cast<BasicAlgo*>(x); if (b) b->ff(); });
g.do_it();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIFN0cmF0ZWd5OyAKc3RydWN0IFNjaGVkdWxlZEV2ZW50IHsKCWZ1bmN0aW9uPHZvaWQoU3RyYXRlZ3kqKT4gdG9jYWxsOyAKCXZvaWQgcGVyZm9ybShTdHJhdGVneSp1KSB7IHRvY2FsbCh1KTsgfQoJU2NoZWR1bGVkRXZlbnQoZnVuY3Rpb248dm9pZChTdHJhdGVneSopPiBmdW5jKSA6IHRvY2FsbChmdW5jKSB7IH0KfTsKCmNsYXNzIFN0cmF0ZWd5IHsKCXZlY3Rvcjx1bmlxdWVfcHRyPFNjaGVkdWxlZEV2ZW50Pj4gaGVhcF9ldmVudGxpc3Q7CnB1YmxpYzogCgl2b2lkIHNjaGVkdWxlX2Z1bmN0aW9uKGZ1bmN0aW9uPHZvaWQoU3RyYXRlZ3kqKT4gZnVuYykgewogICAgCS8vIFB1dHMgdGhlIHNjaGVkdWxlZCBldmVudCBidWlsdCB3aXRoIHRoZSBzdHJhdGVneSBmdW5jdGlvbiBvbnRvIGEgbGlzdAogICAgCWhlYXBfZXZlbnRsaXN0LmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFNjaGVkdWxlZEV2ZW50PihmdW5jKSk7Cgl9Cgl2b2lkIGRvX2l0KCkgewoJCWZvciAoYXV0byAmeDpoZWFwX2V2ZW50bGlzdCkgCgkJCXgtPnBlcmZvcm0odGhpcyk7Cgl9CiAgICB2aXJ0dWFsIHZvaWQgZigpIHsgY291dCA8PCJTdHJhdGVneSI8PGVuZGw7IH0KfTsKCnN0cnVjdCBCYXNpY0FsZ28gOiBTdHJhdGVneSB7CglzdHJpbmcgYj0iQmFzaWNBbGdvIjsKICAgIHZvaWQgZmYoKSB7IGNvdXQgPDwgYjw8ZW5kbDsgfQp9OwoKCmludCBtYWluKCkgewoJQmFzaWNBbGdvIGc7CglnLnNjaGVkdWxlX2Z1bmN0aW9uICgmQmFzaWNBbGdvOjpmKTsKCWcuc2NoZWR1bGVfZnVuY3Rpb24gKFtdKFN0cmF0ZWd5ICp4KS0+dm9pZCB7IEJhc2ljQWxnbypiPWR5bmFtaWNfY2FzdDxCYXNpY0FsZ28qPih4KTsgaWYgKGIpIGItPmZmKCk7IH0pOwogICAgZy5kb19pdCgpOyAKCglyZXR1cm4gMDsKfQ==