将类成员指针传递给 Lambda 捕获列表 c++11

Passing class member pointer to Lambda capture-list c++11

本文关键字:Lambda 列表 c++11 成员 指针      更新时间:2023-10-16

我尝试将成员指针传递给 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 Tickn");
        }, 1000, 1000);

错误不是来自创建 lambda;而是来自尝试将 lambda 传递给 Timer::start()

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

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

更全面的答案:将 lambda 作为函数指针传递