无法绑定可变参数函数并保存到std :: function

时间:2018-05-21 20:44:46

标签: c++ function c++11 variadic-templates stdbind

我成功实现了自己的thread_pool类,我可以在其中提交可以返回任何值但只能获取零参数的lambda。我想改进它,以便它可以像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_nmy_func

的参数

为此,我成功地创建了一个可以获取大量参数的函数,但是我没有设法将此函数保存在我的std :: function队列中。我在这个链接上阅读: Passing a variadic function as argument如何使用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 :(得分:3)

std::bind将参数作为左值传递。来自cppreference

  

普通存储的参数arg作为lvalue参数

传递给invokable对象

指定test1<int>时,该功能变为void test1(int&&),无法接受左值。