#include <iostream>
#include <functional>
#include <vector>
template <typename T>
class Event
{
public:
using func = std::function<void(T)>;
void Raise(T arg)
{
for (auto handler : _handlers)
{
handler(arg);
}
}
void operator ()(T arg)
{
Raise(arg);
}
Event& operator += (func f)
{
_handlers.push_back(f);
return *this;
}
Event& operator -= (func f)
{
for (auto handler : _handlers)
{
if (handler.template target<void(T)>() == f.template target<void(T)>())
{
_handlers.erase(handler);
break;
}
}
return *this;
}
private:
std::vector<func> _handlers;
};
class SomeClass
{
public:
Event<std::string> SomethingChanged;
};
class Onemoreclass
{
SomeClass _someClass{};
public:
Onemoreclass()
{
using namespace std::placeholders;
_someClass.SomethingChanged += std::bind(&Onemoreclass::Print, this, _1);
}
private:
void Print(std::string message) {std::cout << message << std::endl; }
};
int main() {
// your code goes here
Onemoreclass one;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBFdmVudAp7CnB1YmxpYzoKICAgIHVzaW5nIGZ1bmMgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVCk+OwoKCiAgICB2b2lkIFJhaXNlKFQgYXJnKQogICAgewogICAgICAgIGZvciAoYXV0byBoYW5kbGVyIDogX2hhbmRsZXJzKQogICAgICAgIHsKICAgICAgICAgICAgaGFuZGxlcihhcmcpOwogICAgICAgIH0gICAgICAgIAogICAgfQoKICAgIHZvaWQgb3BlcmF0b3IgKCkoVCBhcmcpCiAgICB7CiAgICAgICAgUmFpc2UoYXJnKTsKICAgIH0KCiAgICBFdmVudCYgb3BlcmF0b3IgKz0gKGZ1bmMgZikKICAgIHsKICAgICAgICBfaGFuZGxlcnMucHVzaF9iYWNrKGYpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBFdmVudCYgb3BlcmF0b3IgLT0gKGZ1bmMgZikKICAgIHsKICAgICAgICBmb3IgKGF1dG8gaGFuZGxlciA6IF9oYW5kbGVycykKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaGFuZGxlci50ZW1wbGF0ZSB0YXJnZXQ8dm9pZChUKT4oKSA9PSBmLnRlbXBsYXRlIHRhcmdldDx2b2lkKFQpPigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfaGFuZGxlcnMuZXJhc2UoaGFuZGxlcik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPGZ1bmM+IF9oYW5kbGVyczsKfTsKCmNsYXNzIFNvbWVDbGFzcwp7CiBwdWJsaWM6CiAgICAgICBFdmVudDxzdGQ6OnN0cmluZz4gU29tZXRoaW5nQ2hhbmdlZDsKfTsKCmNsYXNzIE9uZW1vcmVjbGFzcwp7CiAgICAgU29tZUNsYXNzIF9zb21lQ2xhc3N7fTsKcHVibGljOiAKICAgT25lbW9yZWNsYXNzKCkKICB7CiAgCSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOwogICAgICBfc29tZUNsYXNzLlNvbWV0aGluZ0NoYW5nZWQgICs9IHN0ZDo6YmluZCgmT25lbW9yZWNsYXNzOjpQcmludCwgdGhpcywgXzEpOwogIH0KCnByaXZhdGU6CiAgICB2b2lkIFByaW50KHN0ZDo6c3RyaW5nIG1lc3NhZ2UpICAge3N0ZDo6Y291dCA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglPbmVtb3JlY2xhc3Mgb25lOwoJCglyZXR1cm4gMDsKfQ==