我需要使用DLL库,该库为我提供了如下定义的回调函数:
typedef void ( __stdcall *PAmsRouterNotificationFuncEx)( long nEvent );
用于注册给定回调函数的函数是:
bool RigisterStatusMonitorFunc(PAmsRouterNotificationFuncEx fpFuncAMS);
我尝试这样称呼它(在按钮处理功能中):
auto fpTc2RouterCall = [](LONG nReason){
switch (nReason)
{
case AMSEVENT_ROUTERSTOP:
...
break;
case AMSEVENT_ROUTERSTART:
...
break;
case AMSEVENT_ROUTERREMOVED:
...
break;
default:
...
break;
}
};
…… ……
RigisterStatusMonitorFunc(fpTc2RouterCall); //It works.
但是,当我在捕获列表中添加[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!
如果添加[this],则表示VS2013中存在错误:1 IntelliSense:不存在将[[] void lambda(nReason LONG)-> void“转换为” PAmsRouterNotificationFuncEx“的适当转换函数f:\ Study \ omsPrinter.cpp 280
似乎很奇怪,谁能告诉我为什么?
因为无状态lambda会衰减到函数指针,而有状态则不会。捕获时this
,会将lambda转换为有状态的,因为创建的闭包需要将指针存储在其中。当您不捕获任何内容时,闭包不需要存储任何内容,并且它可以与独立函数一样对待。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句