не может связать переменную функцию и сохранить в std :: function - PullRequest
0 голосов
/ 21 мая 2018

Я успешно реализовал свой собственный класс 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

1 Ответ

0 голосов
/ 21 мая 2018

std::bind передаст аргумент как lvalue.Из cppreference :

обычный хранимый аргумент arg передается вызываемому объекту в качестве аргумента lvalue

Когда вы указываете test1<int>, функциястановится void test1(int&&), что не может принимать lvalue.

...