#pragma once #include #include #include #include namespace td { namespace utils { template class Signal : private NonCopyable { public: using FnType = void(Args...); using CallBack = std::function; private: std::vector m_Callbacks; public: void Connect(const CallBack& a_Callback) { m_Callbacks.push_back(a_Callback); } void Disconnect(const CallBack& a_Callback) { auto it = std::find_if(m_Callbacks.begin(), m_Callbacks.end(), [&a_Callback](CallBack& callback) { return a_Callback.template target() == callback.template target(); }); m_Callbacks.erase(it); } void operator()(Args... args) const { for (const CallBack& callback : m_Callbacks) { callback(args...); } } }; } // namespace utils } // namespace td