у рузультата std::bind. почему данные в бинд попадают по универсальной ссылке, но объект их сохраняет в картеже без ссылок? это можно поправить через std::ref, это я знаю. Но может можно как-то без этого?
bind не надо делать, есть лямбды
в лямбды закручивать логику вызова методов? ну как-то не хочется
А так надо код смотреть
template <class Fn, class... Args> std::future<std::invoke_result_t<Fn, Args...>> threadpool::enqueue(Fn&& fn, Args&&...args) { using invoke_result_t = std::invoke_result_t<Fn, Args...>; auto pTask = std::make_unique<std::packaged_task<invoke_result_t()>>( std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...) ); std::future<invoke_result_t> res = pTask->get_future(); { std::unique_lock<std::mutex> locker(queue_mutex_); if (stop_pool_) throw std::runtime_error("ThreadPool, push task failed. How did you do it?"); tasks_.emplace([utask = std::move(pTask)] { (*utask)(); }); } condition_.notify_one(); return res; }
Ну так выкиньте просто args
Обсуждают сегодня