template<typename F, typename ...Args>autorun(F&& f, Args&&... args)-> std::result_of_t<F(Args...)>{
using ResultType = std::result_of_t<F(Args...)>;//std::shared_ptr<std::packaged_task<ResultType()>> task_ptr =// std::make_shared<std::packaged_task<ResultType()>>(// std::bind(std::forward<F>(f), std::forward<Args>(args)...));
std::shared_ptr<std::packaged_task<ResultType()>> task =
std::make_shared<std::packaged_task<ResultType()>>([???](){//What do I have to do to make it the same ?});
std::future<ResultType> result_future = task->get_future();{
ThreadPoolLock u_lock(task_mutex);
tasks_queue.emplace([task](){(*task)();});}
task_cv.notify_one();return std::move(result_future.get());}