Implement make_shared_callback

This commit is contained in:
Denis Blank 2015-06-09 23:44:09 +02:00 committed by Naios
parent 7a67bff246
commit 4b10c95cfc
2 changed files with 27 additions and 5 deletions

View File

@ -22,6 +22,7 @@
#include <utility>
#include <memory>
#include "functional_unwrap.hpp"
template<typename... Args>
using Callback = std::function<void(Args...)>;
@ -32,11 +33,32 @@ using SharedCallback = std::shared_ptr<Callback<Args...>>;
template<typename... Args>
using WeakCallback = std::weak_ptr<Callback<Args...>>;
template<typename... Args>
auto make_shared_callback(Callback<Args...>&& callback)
-> SharedCallback<Args...>
namespace detail
{
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_

View File

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