diff --git a/source/mijin/async/signal.hpp b/source/mijin/async/signal.hpp index 75e6ffa..9152c0f 100644 --- a/source/mijin/async/signal.hpp +++ b/source/mijin/async/signal.hpp @@ -64,6 +64,8 @@ public: inline token_t connect(THandler handler, Oneshot oneshot = Oneshot::NO, std::weak_ptr referenced = std::weak_ptr()) MIJIN_NOEXCEPT; template inline token_t connect(TObject& object, void (TObject::* handler)(TArgs...), Oneshot oneshot = Oneshot::NO, std::weak_ptr referenced = std::weak_ptr()) MIJIN_NOEXCEPT; + template + inline token_t connect(TObject& object, void (TObject::* handler)(TArgs...) const, Oneshot oneshot = Oneshot::NO, std::weak_ptr referenced = std::weak_ptr()) MIJIN_NOEXCEPT; inline void disconnect(token_t token) MIJIN_NOEXCEPT; template @@ -114,6 +116,26 @@ inline auto BaseSignal::connect(TObject& object, void (TOb return nextToken++; } +template typename TAllocator, typename... TArgs> +template +inline auto BaseSignal::connect(TObject& object, void (TObject::* handler)(TArgs...) const, Oneshot oneshot, std::weak_ptr referenced) MIJIN_NOEXCEPT -> token_t +{ + std::lock_guard lock(handlersMutex_); + + auto callable = [object = &object, handler](TArgs... args) + { + std::invoke(handler, object, std::forward(args)...); + }; + handlers_.push_back({ + .callable = std::move(callable), + .referenced = std::move(referenced), + .token = nextToken, + .oneshot = oneshot + }); + + return nextToken++; +} + template typename TAllocator, typename... TArgs> inline void BaseSignal::disconnect(token_t token) MIJIN_NOEXCEPT {