#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==