Я успешно реализовал свой собственный класс thread_pool
, где я могу отправлять лямбда-выражения, которые могут возвращать любое значение, но могут принимать только нулевые аргументы.Я хотел бы улучшить его так, чтобы он мог работать как std::async
, где его можно назвать следующим образом: std::async(my_function, arg_1, arg_2, ..., arg_n)
.Как я сейчас понимаю, это выглядит следующим образом:
template<typename T>
auto enqueue_task(T&& task) -> std::future<decltype(task())>
{
auto wrapper = std::make_shared<std::packaged_task<decltype(task())()>>(std::forward<T>(task));
{
//some mutex
std::unique_lock<std::mutex> mutex(mutex_);
//The task is added to a queue of std::function<void()>
tasks_.emplace([=] {(*wrapper)(); });
}
has_work_.notify_one();
return wrapper->get_future();
}
Мое идеальное решение было бы таким, чтобы я мог передавать аргументы функтинонам в моем thread_pool
, например:
pool.enqueue_task(my_function, arg_1, arg_2, ..., arg_n)
где arg_1, ..., arg_n
являются аргументами my_func
Для этого я успешно создал функцию, которая может принимать различное количество аргументов, но мне не удалось сохранить эту функцию в моей очереди std :: function,Я прочитал по этой ссылке: Передав переменную функцию в качестве аргумента , как достичь своей цели с помощью std :: bind.И все же мне не удалось достичь своей цели.Вот как я это понял, что оказалось не сработало:
//some function with variadic arguments
template <typename... Args>
void test1(Args&&... args)
{
}
void test2(int a)
{
}
//main method
std::function<void()> a = std::bind(test2, 2) //works
std::function<void()> b = std::bind(test1<int>, 1) //does not work