【问题标题】:Passing class member pointer to Lambda capture-list c++11将类成员指针传递给 Lambda 捕获列表 c++11
【发布时间】:2017-06-20 05:16:01
【问题描述】:

我尝试将成员指针传递给 C++11 lambda,但没有成功

pHub是成员指针

我不断收到以下错误

error C2664: 'void Timer::start(void (__cdecl *)(Timer *),int,int)': cannot convert argument 1 from 'Scheduler::start::<lambda_292d45d0b31426827abd837d93b45bff>' to 'void (__cdecl *)(Timer *)'

我希望能够在函数内部使用pHub

  pTimer = new Timer(pHub->getLoop());
        pTimer->start([this](Timer *tick) {
            uv_update_time(pHub->getLoop());
            start_time = uv_now(pHub->getLoop());
            printf("Im Tick\n");
        }, 1000, 1000);

【问题讨论】:

  • 只有无捕获的 lambda 可以转换为函数指针。
  • 什么意思
  • 你应该发布Timer的定义,至少是相关的部分,如果你想获得正确的帮助。

标签: c++ c++11 lambda


【解决方案1】:

错误不是来自创建 lambda;这是因为试图将 lambda 传递给Timer::start()

Timer::start() 期待void (__cdecl *)(Timer *) 类型的参数——即一个普通的函数指针。因为您正在尝试捕获一些数据 ([this]),所以您的 lambda 表达式正在创建一个仿函数(一个可调用对象)。

想一想:Timer::start() 的函数指针参数将被传递单个指针(它希望指向适当的函数)。没有地方可以传递任何附加数据(this、函子的地址等)。 (这就是为什么 C 中的回调代码通常有一个回调数据参数和一个函数指针。)

更全面的答案:Passing lambda as function pointer

【讨论】:

  • 我不明白有人如何支持这个答案。它包含很多错误。
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2014-03-06
  • 2015-08-01
相关资源
最近更新 更多