首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在线程池的队列中传递一个参数数目可变的void函数?

如何在线程池的队列中传递一个参数数目可变的void函数?
EN

Stack Overflow用户
提问于 2021-10-02 23:53:42
回答 1查看 48关注 0票数 0

我一直在尝试实现某种线程池。我需要在Queue中获取一些任务,这些任务可能会有一些参数。

代码语言:javascript
复制
template <typename FUNCTION, typename... ARGS>
    void push_function(const FUNCTION &function, const ARGS &...args){
        push_function([function, args...]{ function(args...); });
    }

    template <typename FUNCTION>

void push_function(FUNCTION &function){
    {
    std::unique_lock<std::mutex> lock(queue_mutex);
    queue.push(std::function<void()>(function));
    }   
    cv.notify_one();
}

由于这一行,我得到了错误:must use '.*' or '->' to call pointer-to-member function in 'function(...)'...

代码语言:javascript
复制
push_function([function, args...]{ function(args...); });
EN

回答 1

Stack Overflow用户

发布于 2021-10-02 23:57:30

您正在推送一个非静态成员函数。

  1. 这些需要一个this指针。

  1. 你需要使用std::invoke来统一对待它们。

尝试:

代码语言:javascript
复制
 template <typename FUNCTION, typename... ARGS>
 void push_function(const FUNCTION &function, const ARGS &...args){
    push_function([function, args...]{ std::invoke(function,args...); });
 }

并将对象的指针作为第二个参数传递给push函数。

如果您缺少std invoke,请使用:

代码语言:javascript
复制
 template <typename FUNCTION, typename... ARGS>
 void push_function(const FUNCTION &function, const ARGS &...args){
    push_function([function, args...]{ std::cref(function)(args...); });
 }

作为获得相同行为的一种方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69421068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档