#pragma once #include #include #include namespace td { namespace utils { template class ObjectNotifier { protected: std::vector m_Listeners; public: void BindListener(Listener* listener) { m_Listeners.push_back(listener); } void UnbindListener(Listener* listener) { auto iter = std::find(m_Listeners.begin(), m_Listeners.end(), listener); if (iter == m_Listeners.end()) return; m_Listeners.erase(iter); } template void NotifyListeners(Func function, Args... args) { for (Listener* listener : m_Listeners) std::bind(function, listener, args...)(); } }; } // namespace utils } // namespace td