#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()
{
_someClass.SomethingChanged += std::bind(&Onemoreclass::Print, *this, std::placeholders::_1);
}
private:
void Print(std::string message) {std::cout << message << std::endl; }
};
int main() {
// your code goes here
Onemoreclass one;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBFdmVudAp7CnB1YmxpYzoKICAgIHVzaW5nIGZ1bmMgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoVCk+OwoKCiAgICB2b2lkIFJhaXNlKFQgYXJnKQogICAgewogICAgICAgIGZvciAoYXV0byBoYW5kbGVyIDogX2hhbmRsZXJzKQogICAgICAgIHsKICAgICAgICAgICAgaGFuZGxlcihhcmcpOwogICAgICAgIH0gICAgICAgIAogICAgfQoKICAgIHZvaWQgb3BlcmF0b3IgKCkoVCBhcmcpCiAgICB7CiAgICAgICAgUmFpc2UoYXJnKTsKICAgIH0KCiAgICBFdmVudCYgb3BlcmF0b3IgKz0gKGZ1bmMgZikKICAgIHsKICAgICAgICBfaGFuZGxlcnMucHVzaF9iYWNrKGYpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBFdmVudCYgb3BlcmF0b3IgLT0gKGZ1bmMgZikKICAgIHsKICAgICAgICBmb3IgKGF1dG8gaGFuZGxlciA6IF9oYW5kbGVycykKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaGFuZGxlci50ZW1wbGF0ZSB0YXJnZXQ8dm9pZChUKT4oKSA9PSBmLnRlbXBsYXRlIHRhcmdldDx2b2lkKFQpPigpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBfaGFuZGxlcnMuZXJhc2UoaGFuZGxlcik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPGZ1bmM+IF9oYW5kbGVyczsKfTsKCmNsYXNzIFNvbWVDbGFzcwp7CiBwdWJsaWM6CiAgICAgICBFdmVudDxzdGQ6OnN0cmluZz4gU29tZXRoaW5nQ2hhbmdlZDsKfTsKCmNsYXNzIE9uZW1vcmVjbGFzcwp7CiAgICAgU29tZUNsYXNzIF9zb21lQ2xhc3N7fTsKcHVibGljOiAKICAgT25lbW9yZWNsYXNzKCkKICB7CiAgICAgIF9zb21lQ2xhc3MuU29tZXRoaW5nQ2hhbmdlZCAgKz0gc3RkOjpiaW5kKCZPbmVtb3JlY2xhc3M6OlByaW50LCAqdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKICB9Cgpwcml2YXRlOgogICAgdm9pZCBQcmludChzdGQ6OnN0cmluZyBtZXNzYWdlKSAgIHtzdGQ6OmNvdXQgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7IH0KfTsKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJT25lbW9yZWNsYXNzIG9uZTsKCQoJcmV0dXJuIDA7Cn0=