#pragma once #include namespace td { namespace utils { /** * \brief Wrapper class to automatically disconnect from a Signal on object destruction * \sa Signal */ class SlotGuard { private: std::vector> m_Deleters; public: /** * \brief Connect a signal to a function (with the same signature) */ template void Connect(Signal& a_Signal, const typename Signal::CallBack& a_Callback) { a_Signal.Connect(a_Callback); m_Deleters.push_back([&a_Signal, &a_Callback]() { a_Signal.Disconnect(a_Callback); }); } ~SlotGuard() { for (auto& deleter : m_Deleters) { deleter(); } } }; } // namespace utils } // namespace td