From 4b10c95cfc1aa2a74ea3ad523ac42d1fb99c73ce Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Tue, 9 Jun 2015 23:44:09 +0200 Subject: [PATCH] Implement make_shared_callback --- fluent++/Callback.h | 30 ++++++++++++++++++++++++++---- test.cpp | 2 +- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/fluent++/Callback.h b/fluent++/Callback.h index 90fba9c..bb9a443 100644 --- a/fluent++/Callback.h +++ b/fluent++/Callback.h @@ -22,6 +22,7 @@ #include #include +#include "functional_unwrap.hpp" template using Callback = std::function; @@ -32,11 +33,32 @@ using SharedCallback = std::shared_ptr>; template using WeakCallback = std::weak_ptr>; -template -auto make_shared_callback(Callback&& callback) - -> SharedCallback +namespace detail { - return std::make_shared>(std::forward>(callback)); + template + struct do_unwrap_callback; + + template + struct do_unwrap_callback> + { + typedef Callback CallbackType; + + typedef SharedCallback SharedCallbackType; + + typedef WeakCallback WeakCallbackType; + }; + + template + using unwrap_callback = do_unwrap_callback<::fu::argument_type_t<_CTy>>; + +} // detail + +template +typename detail::unwrap_callback<_CTy>::SharedCallbackType + make_shared_callback(_CTy&& callback) +{ + return std::make_shared::CallbackType> + (std::forward::CallbackType>(callback)); } #endif /// _TASK_SCHEDULER_H_ diff --git a/test.cpp b/test.cpp index 7e48b18..01b42af 100644 --- a/test.cpp +++ b/test.cpp @@ -41,7 +41,7 @@ int main(int argc, char** argv) cbd2 _cbd2; cbd3 _cbd3; - auto cb = make_shared_callback([](bool) + auto cb = make_shared_callback([](bool) { });