#include <iostream>
#include <vector>
#include <memory>
using namespace std;
//************* Definitions
class OtherClass;
class Command {
public:
virtual void execute() = 0;
virtual ~Command();
};
class CommandOtherClass : public Command {
OtherClass *target;
void (OtherClass::*f)();
public:
CommandOtherClass (void (OtherClass::*fct)(), OtherClass*t);
void execute() override;
};
class CommandAdHoc : public Command {
public:
void execute() override;
};
class SomeClass {
public:
static std::vector<unique_ptr<Command>> UpdateFuncs;
static void executeAll();
};
class OtherClass{
private:
void Update();
public:
OtherClass();
};
//*************** Implementation
std::vector<unique_ptr<Command>> SomeClass::UpdateFuncs;
Command::~Command() {}
CommandOtherClass::CommandOtherClass (void (OtherClass::*fct)(), OtherClass*t)
: f(fct),target(t)
{
}
void CommandOtherClass::execute() {
(target->*f)();
}
void CommandAdHoc::execute() {
cout<<"Taht's all folks :-) !"<<endl;
}
void SomeClass::executeAll() {
for (auto &x:UpdateFuncs)
x->execute();
}
OtherClass::OtherClass() {
SomeClass::UpdateFuncs.push_back(make_unique<CommandOtherClass>(&OtherClass::Update, this));
}
void OtherClass::Update() {
cout << "Hello, world, said by "<<this<<endl;
}
int main() {
OtherClass a,b;
SomeClass::UpdateFuncs.push_back(make_unique<CommandAdHoc>());
SomeClass::executeAll();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8qKioqKioqKioqKioqIERlZmluaXRpb25zCmNsYXNzIE90aGVyQ2xhc3M7CgpjbGFzcyBDb21tYW5kIHsKcHVibGljOiAKICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKCkgPSAwOyAKICAgIHZpcnR1YWwgfkNvbW1hbmQoKTsKfTsgCmNsYXNzIENvbW1hbmRPdGhlckNsYXNzIDogcHVibGljIENvbW1hbmQgeyAKICAgIE90aGVyQ2xhc3MgKnRhcmdldDsgCiAgICB2b2lkIChPdGhlckNsYXNzOjoqZikoKTsgCnB1YmxpYzogCiAgICBDb21tYW5kT3RoZXJDbGFzcyAodm9pZCAoT3RoZXJDbGFzczo6KmZjdCkoKSwgT3RoZXJDbGFzcyp0KTsgCiAgICB2b2lkIGV4ZWN1dGUoKSBvdmVycmlkZTsgCn07CmNsYXNzIENvbW1hbmRBZEhvYyA6IHB1YmxpYyBDb21tYW5kIHsgCnB1YmxpYzogCiAgICB2b2lkIGV4ZWN1dGUoKSBvdmVycmlkZTsgCn07CmNsYXNzIFNvbWVDbGFzcyB7CnB1YmxpYzoKICAgIHN0YXRpYyBzdGQ6OnZlY3Rvcjx1bmlxdWVfcHRyPENvbW1hbmQ+PiBVcGRhdGVGdW5jczsKICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGVBbGwoKTsKfTsKCmNsYXNzIE90aGVyQ2xhc3N7CnByaXZhdGU6CiAgICB2b2lkIFVwZGF0ZSgpOwpwdWJsaWM6CiAgICBPdGhlckNsYXNzKCk7Cn07CgovLyoqKioqKioqKioqKioqKiBJbXBsZW1lbnRhdGlvbgoKc3RkOjp2ZWN0b3I8dW5pcXVlX3B0cjxDb21tYW5kPj4gU29tZUNsYXNzOjpVcGRhdGVGdW5jczsKQ29tbWFuZDo6fkNvbW1hbmQoKSB7fQpDb21tYW5kT3RoZXJDbGFzczo6Q29tbWFuZE90aGVyQ2xhc3MgKHZvaWQgKE90aGVyQ2xhc3M6OipmY3QpKCksIE90aGVyQ2xhc3MqdCkgCiAgICA6ICBmKGZjdCksdGFyZ2V0KHQpCnsKfSAKdm9pZCBDb21tYW5kT3RoZXJDbGFzczo6ZXhlY3V0ZSgpIHsKCSh0YXJnZXQtPipmKSgpOwp9CnZvaWQgQ29tbWFuZEFkSG9jOjpleGVjdXRlKCkgewoJY291dDw8IlRhaHQncyBhbGwgZm9sa3MgOi0pICEiPDxlbmRsOwp9Cgp2b2lkIFNvbWVDbGFzczo6ZXhlY3V0ZUFsbCgpIHsKICAgIGZvciAoYXV0byAmeDpVcGRhdGVGdW5jcykgCiAgICAgICAgeC0+ZXhlY3V0ZSgpOyAKfQpPdGhlckNsYXNzOjpPdGhlckNsYXNzKCkgewogICAgU29tZUNsYXNzOjpVcGRhdGVGdW5jcy5wdXNoX2JhY2sobWFrZV91bmlxdWU8Q29tbWFuZE90aGVyQ2xhc3M+KCZPdGhlckNsYXNzOjpVcGRhdGUsIHRoaXMpKTsKfQp2b2lkIE90aGVyQ2xhc3M6OlVwZGF0ZSgpIHsKICAgIGNvdXQgPDwgIkhlbGxvLCB3b3JsZCwgc2FpZCBieSAiPDx0aGlzPDxlbmRsOwp9CgppbnQgbWFpbigpIHsKICAgIE90aGVyQ2xhc3MgYSxiOyAKICAgIFNvbWVDbGFzczo6VXBkYXRlRnVuY3MucHVzaF9iYWNrKG1ha2VfdW5pcXVlPENvbW1hbmRBZEhvYz4oKSk7CiAgIAogICAgU29tZUNsYXNzOjpleGVjdXRlQWxsKCk7IAogICAgcmV0dXJuIDA7Cn0=