#pragma once #include #include template class Event; template class EventConnection { private: using delegate = std::function; public: EventConnection(Event *creator, delegate cb); bool Disconnect(); // Breaks the event connection, but does not destroy the instance void Invoke(Args... e); private: Event * owner; delegate callback; bool active = true; }; template EventConnection::EventConnection(Event *creator, EventConnection::delegate cb) : owner(creator), callback(std::move(cb)) {} template void EventConnection::Invoke(Args... e) { callback(e...); } template bool EventConnection::Disconnect() { if (active) { owner->Disconnect(this); active = false; return true; } return false; }