Implement make_shared_callback

This commit is contained in:
Naios 2015-06-09 23:44:09 +02:00
parent 3ca62d4dbc
commit aa8865a0e4
2 changed files with 27 additions and 5 deletions

View File

@ -22,6 +22,7 @@
#include <utility> #include <utility>
#include <memory> #include <memory>
#include "functional_unwrap.hpp"
template<typename... Args> template<typename... Args>
using Callback = std::function<void(Args...)>; using Callback = std::function<void(Args...)>;
@ -32,11 +33,32 @@ using SharedCallback = std::shared_ptr<Callback<Args...>>;
template<typename... Args> template<typename... Args>
using WeakCallback = std::weak_ptr<Callback<Args...>>; using WeakCallback = std::weak_ptr<Callback<Args...>>;
template<typename... Args> namespace detail
auto make_shared_callback(Callback<Args...>&& callback)
-> SharedCallback<Args...>
{ {
return std::make_shared<Callback<Args...>>(std::forward<Callback<Args...>>(callback)); template<typename... Args>
struct do_unwrap_callback;
template<typename... Args>
struct do_unwrap_callback<std::tuple<Args...>>
{
typedef Callback<Args...> CallbackType;
typedef SharedCallback<Args...> SharedCallbackType;
typedef WeakCallback<Args...> WeakCallbackType;
};
template<typename _CTy>
using unwrap_callback = do_unwrap_callback<::fu::argument_type_t<_CTy>>;
} // detail
template<typename _CTy>
typename detail::unwrap_callback<_CTy>::SharedCallbackType
make_shared_callback(_CTy&& callback)
{
return std::make_shared<typename detail::unwrap_callback<_CTy>::CallbackType>
(std::forward<typename detail::unwrap_callback<_CTy>::CallbackType>(callback));
} }
#endif /// _TASK_SCHEDULER_H_ #endif /// _TASK_SCHEDULER_H_

View File

@ -41,7 +41,7 @@ int main(int argc, char** argv)
cbd2 _cbd2; cbd2 _cbd2;
cbd3 _cbd3; cbd3 _cbd3;
auto cb = make_shared_callback<bool>([](bool) auto cb = make_shared_callback([](bool)
{ {
}); });