#include <iostream>
#include <functional>
#include <vector>
template<typename Sig>
class EventDispatcher
{
public:
using Event = std::function<Sig>;
template<typename... Args>
void Invoke(Args&& ...Params)
{
for (auto&& event : m_Events)
{
event(std::forward<Args>(Params)...);
}
}
void operator+=(const Event& event)
{
m_Events.emplace_back(event);
}
private:
std::vector<Event> m_Events;
};
class Base
{
public:
using eCallbacks = EventDispatcher<void(Base*)>;
eCallbacks& RenderEvent() { return m_eRenderEvent; };
void Invoke() { m_eRenderEvent.Invoke(this);}
private:
eCallbacks m_eRenderEvent;
};
void Event1(Base*)
{
std::cout << "Event1\n";
}
void Event2(Base*, int value)
{
std::cout << "Event2(" << value << ")\n";
}
int main() {
Base base;
int IntToPass = 12345;
base.RenderEvent() += Event1;
base.RenderEvent() += [=](Base* arg ) { Event2(arg, IntToPass);};
base.Invoke();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlPHR5cGVuYW1lIFNpZz4KY2xhc3MgRXZlbnREaXNwYXRjaGVyCnsKcHVibGljOgogICAgdXNpbmcgRXZlbnQgPSBzdGQ6OmZ1bmN0aW9uPFNpZz47CgogICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KICAgIHZvaWQgSW52b2tlKEFyZ3MmJiAuLi5QYXJhbXMpCiAgICB7CiAgICAgICAgZm9yIChhdXRvJiYgZXZlbnQgOiBtX0V2ZW50cykKICAgICAgICB7CiAgICAgICAgICAgIGV2ZW50KHN0ZDo6Zm9yd2FyZDxBcmdzPihQYXJhbXMpLi4uKTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBvcGVyYXRvcis9KGNvbnN0IEV2ZW50JiBldmVudCkKICAgIHsKICAgICAgICBtX0V2ZW50cy5lbXBsYWNlX2JhY2soZXZlbnQpOwogICAgfQoKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPEV2ZW50PiBtX0V2ZW50czsKfTsKCmNsYXNzIEJhc2UKewpwdWJsaWM6CiAgICB1c2luZyBlQ2FsbGJhY2tzID0gRXZlbnREaXNwYXRjaGVyPHZvaWQoQmFzZSopPjsKCiAgICBlQ2FsbGJhY2tzJiBSZW5kZXJFdmVudCgpIHsgcmV0dXJuIG1fZVJlbmRlckV2ZW50OyB9OwoKICAgIHZvaWQgSW52b2tlKCkgeyBtX2VSZW5kZXJFdmVudC5JbnZva2UodGhpcyk7fQoKcHJpdmF0ZToKICAgIGVDYWxsYmFja3MgbV9lUmVuZGVyRXZlbnQ7Cn07CgoKdm9pZCBFdmVudDEoQmFzZSopCnsKICAgIHN0ZDo6Y291dCA8PCAiRXZlbnQxXG4iOwp9Cgp2b2lkIEV2ZW50MihCYXNlKiwgaW50IHZhbHVlKQp7CiAgICBzdGQ6OmNvdXQgPDwgIkV2ZW50MigiIDw8IHZhbHVlIDw8ICIpXG4iOwp9CgppbnQgbWFpbigpIHsKCiAgICBCYXNlIGJhc2U7CgogICAgaW50IEludFRvUGFzcyA9IDEyMzQ1OwoKICAgIGJhc2UuUmVuZGVyRXZlbnQoKSArPSBFdmVudDE7CiAgICBiYXNlLlJlbmRlckV2ZW50KCkgKz0gWz1dKEJhc2UqIGFyZyApIHsgRXZlbnQyKGFyZywgSW50VG9QYXNzKTt9OwoKCiAgICBiYXNlLkludm9rZSgpOwp9Cg==