【问题标题】:cannot bind variadic function and save to a std::function无法绑定可变参数函数并保存到 std::function
【发布时间】:2018-05-21 20:44:46
【问题描述】:

我成功实现了我自己的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

【问题讨论】:

  • 有什么理由在 lambda 上使用 bindb = [](){ test1(1); }; 应该可以工作。
  • test1&lt;int&gt; 具有签名void test1(int&amp;&amp; arg)。只接受右值引用。
  • 您正在尝试将 int 类型的左值传递给从 test1 实例化的函数,作为 test1(int&amp;&amp;) 不起作用。您可能希望将 test1(Args&amp;&amp;...) 更改为 test1(Args...)
  • 或者用test1&lt;int&amp;&gt;代替test&lt;int&gt;

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


【解决方案1】:

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

普通存储参数 arg 作为左值参数传递给可调用对象

指定test1&lt;int&gt;时,函数变为void test1(int&amp;&amp;),不能接受左值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2013-12-14
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多