将类成员指针传递给Lambda capture-list c ++ 11

时间:2017-06-19 19:15:16

标签: c++ c++11 lambda

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

1 个答案:

答案 0 :(得分:1)

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

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

考虑一下:Timer::start()的函数指针参数将被传递一个指针(它希望指向一个合适的函数)。没有任何地方可以传递任何其他数据(this,仿函数的地址等)。 (这就是为什么C中的回调代码通常有一个回调数据参数以及一个函数指针。)

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