diff --git a/package/cpp/ListenerManager.h b/package/cpp/ListenerManager.h index 3110e30d..433d0644 100644 --- a/package/cpp/ListenerManager.h +++ b/package/cpp/ListenerManager.h @@ -8,18 +8,31 @@ #include #include #include +#include namespace margelo { -template class ListenerManager { +template class ListenerManager : public std::enable_shared_from_this> { private: + using TSelf = ListenerManager; std::list _listeners; +private: + std::shared_ptr> shared() { + return this->shared_from_this(); + } + public: Listener add(Callback listener) { _listeners.push_back(std::move(listener)); auto id = --_listeners.end(); - return Listener([id, this]() { _listeners.erase(id); }); + auto weakThis = std::weak_ptr(shared()); + return Listener([id, weakThis]() { + auto sharedThis = weakThis.lock(); + if (sharedThis) { + sharedThis->_listeners.erase(id); + } + }); } const std::list& getListeners() {