decltype of variable template functin

Я хочу вернуть std::future от возвращаемого значения шаблонной функции с переменным числом аргументов, но не могу найти как сделать это правильно.

        template <typename T, typename ...Args>
        auto add_task(T task, Args ...args)->std::future<decltype(task())>
        {
            auto wrapper = std::make_shared<std::packaged_task<decltype(task()) ()>>(std::move(task));
            {
                std::unique_lock<std::mutex> lock(event_mutex);
                tasks.push([=, args...]() { (*wrapper)(args); });
            }
            event.notify_one();
            return wrapper->get_future();
        }

И второй вопрос, как правильно вызвать эту функцию?

(*wrapper)(args);
(*wrapper)(std::forward<Args>(args)...);

Ответы (1 шт):

Автор решения: Zipper

        template <typename F, typename ...Args>
        auto add_task(F&& task, Args&& ...args) ->std::future<decltype(task(args...))>
        {

            auto wrapper = std::make_shared<std::packaged_task<decltype(task(args...))()>>(
                std::bind(std::forward<F>(task), std::forward<Args>(args)...)
            );

            {
                std::unique_lock<std::mutex> lock(event_mutex);
                tasks.push([wrapper]() { (*wrapper)(); });
            }

            event.notify_one();
            return wrapper->get_future();
        }
→ Ссылка