首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用可变参数作为成员函数调用模板化类型

使用可变参数作为成员函数调用模板化类型
EN

Stack Overflow用户
提问于 2020-10-19 22:16:47
回答 2查看 49关注 0票数 0

在这个简单的例子中,我试图调用在EventQueue中模板化的F函数。带有可变参数的。

代码语言:javascript
运行
复制
class EventQueue {
 public:
  EventQueue(int size) {}
  void Dispatch() {}

  template <typename F, typename... Args>
  void Call(F func, Args... args) {
    func(args...);
  }

  void DispatchForever() {}
};

class Example{
    EventQueue eq;
    public:
    Example():eq(10){};
    void Parse(){
        // Do something useful
    }

    void TestRoutine(){

    eq.Call(this,&Example::Parse);
    }
};

int main(){
    Example example;
    example.TestRoutine();
   return 0; 
}

Demo

我得到了这个错误:

代码语言:javascript
运行
复制
<source>: In instantiation of 'void EventQueue::Call(F, Args ...) [with F = Example*; Args = {void (Example::*)()}]':

<source>:25:33:   required from here

<source>:9:9: error: 'func' cannot be used as a function

    9 |     func(args...);

      |     ~~~~^~~~~~~~~

我对此感到有点惊讶,对一些资源的任何帮助都会非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2020-10-19 22:58:46

根据问题作者发布的代码,正确的代码可能如下所示:

代码语言:javascript
运行
复制
struct Foo
{
    template <typename F, typename... Args>
    void Call(F&& func, Args&&...args) {
        std::invoke(std::forward<F>(func), std::forward<Args>(args)...);
    }

    void Parse()
    {
        std::cout << "Parse\n";
    }
};

Demo

票数 1
EN

Stack Overflow用户

发布于 2020-10-19 22:26:44

所以问题被解决了,这是由于调用站点的一个问题。@Yksisarvinen在评论中指出。

从…

代码语言:javascript
运行
复制
queue.Call(this, &Skipper::Parse);

更改为

代码语言:javascript
运行
复制
queue.Call([this]() { this->Parse(); });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64429255

复制
相关文章

相似问题

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