From e68e6c41cc3954ae4684dc77f4aaaa45549998fe Mon Sep 17 00:00:00 2001 From: Haibo Date: Wed, 10 Apr 2019 14:45:38 +0800 Subject: [PATCH] update Closure --- Easy2D/common/closure.hpp | 62 +++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/Easy2D/common/closure.hpp b/Easy2D/common/closure.hpp index 381b42c7..528994c3 100644 --- a/Easy2D/common/closure.hpp +++ b/Easy2D/common/closure.hpp @@ -96,12 +96,6 @@ namespace easy2d public: typedef _Ret(_Ty::* _FuncType)(_Args...); - ProxyMemCallable(void* ptr, _FuncType func) - : ptr_(ptr) - , func_(func) - { - } - virtual _Ret Invoke(_Args... args) const override { return (static_cast<_Ty*>(ptr_)->*func_)(std::forward<_Args>(args)...); @@ -112,7 +106,14 @@ namespace easy2d return new (std::nothrow) ProxyMemCallable<_Ty, _Ret, _Args...>(ptr, func); } - private: + protected: + ProxyMemCallable(void* ptr, _FuncType func) + : ptr_(ptr) + , func_(func) + { + } + + protected: void* ptr_; _FuncType func_; }; @@ -124,12 +125,6 @@ namespace easy2d public: typedef _Ret(_Ty::* _FuncType)(_Args...) const; - ProxyConstMemCallable(void* ptr, _FuncType func) - : ptr_(ptr) - , func_(func) - { - } - virtual _Ret Invoke(_Args... args) const override { return (static_cast<_Ty*>(ptr_)->*func_)(std::forward<_Args>(args)...); @@ -140,7 +135,14 @@ namespace easy2d return new (std::nothrow) ProxyConstMemCallable<_Ty, _Ret, _Args...>(ptr, func); } - private: + protected: + ProxyConstMemCallable(void* ptr, _FuncType func) + : ptr_(ptr) + , func_(func) + { + } + + protected: void* ptr_; _FuncType func_; }; @@ -200,15 +202,19 @@ namespace easy2d if (callable_) callable_->AddRef(); } - template - Closure(void* ptr, _Ret(_Ty::* func)(_Args...)) + template::value || std::is_base_of<_Ty, _Uty>::value, int>::type = 0> + Closure(_Uty* ptr, _Ret(_Ty::* func)(_Args...)) { callable_ = __closure_detail::ProxyMemCallable<_Ty, _Ret, _Args...>::Make(ptr, func); if (callable_) callable_->AddRef(); } - template - Closure(void* ptr, _Ret(_Ty::* func)(_Args...) const) + template::value || std::is_base_of<_Ty, _Uty>::value, int>::type = 0> + Closure(_Uty* ptr, _Ret(_Ty::* func)(_Args...) const) { callable_ = __closure_detail::ProxyConstMemCallable<_Ty, _Ret, _Args...>::Make(ptr, func); if (callable_) callable_->AddRef(); @@ -266,14 +272,26 @@ namespace easy2d __closure_detail::Callable<_Ret, _Args...>* callable_; }; - template - inline Closure<_Ret(_Args...)> MakeClosure(void* ptr, _Ret(_Ty::* func)(_Args...)) + template::value || std::is_base_of<_Ty, _Uty>::value, int + >::type = 0, + typename _Ret, + typename... _Args> + inline Closure<_Ret(_Args...)> MakeClosure(_Uty* ptr, _Ret(_Ty::* func)(_Args...)) { return Closure<_Ret(_Args...)>(ptr, func); } - template - inline Closure<_Ret(_Args...)> MakeClosure(void* ptr, _Ret(_Ty::* func)(_Args...) const) + template::value || std::is_base_of<_Ty, _Uty>::value, int + >::type = 0, + typename _Ret, + typename... _Args> + inline Closure<_Ret(_Args...)> MakeClosure(_Uty* ptr, _Ret(_Ty::* func)(_Args...) const) { return Closure<_Ret(_Args...)>(ptr, func); }