我需要使用一个DLL库,它给我一个定义如下的回调函数:
typedef void ( __stdcall *PAmsRouterNotificationFuncEx)( long nEvent );
Run Code Online (Sandbox Code Playgroud)
用于注册回调函数的函数是:
bool RigisterStatusMonitorFunc(PAmsRouterNotificationFuncEx fpFuncAMS);
Run Code Online (Sandbox Code Playgroud)
我试着像这样调用它(在一个按钮处理函数中):
auto fpTc2RouterCall = [](LONG nReason){
switch (nReason)
{
case AMSEVENT_ROUTERSTOP:
...
break;
case AMSEVENT_ROUTERSTART:
...
break;
case AMSEVENT_ROUTERREMOVED:
...
break;
default:
...
break;
}
};
…… ……
RigisterStatusMonitorFunc(fpTc2RouterCall); //It works.
Run Code Online (Sandbox Code Playgroud)
但是当我在caputure列表中添加[this]时,它不起作用!为什么?
auto fpTc2RouterCall = [this](LONG nReason){
switch (nReason)
{
case AMSEVENT_ROUTERSTOP:
...
StopAMS(); //Member function of this class,I need call it in the lambda expression.
break;
case AMSEVENT_ROUTERSTART:
...
break;
case AMSEVENT_ROUTERREMOVED:
...
break;
default:
...
break;
}
};
…… ……
RigisterStatusMonitorFunc(fpTc2RouterCall); //It doesn't works!
Run Code Online (Sandbox Code Playgroud)
如果我添加[this],它表示VS2013中的错误:1智能感知:对于"[] void lambda(nReason LONG) - > void"到"PAmsRouterNotificationFuncEx"f:\ Study\omsPrinter.cpp 280不存在适当的转换函数
这看起来很奇怪,谁能告诉我为什么?
因为无状态的lambda会衰变为函数指针,而有状态的则不会.捕获时this
,将lambda变为有状态,因为创建的闭包需要将指针存储在其中.当你什么都没有捕获时,闭包不需要存储任何东西,它可以像独立功能一样对待.
归档时间: |
|
查看次数: |
84 次 |
最近记录: |