访问lambdas中的外部上下文

时间:2016-06-18 15:17:53

标签: c++ lambda

这可能是一个非常引人注目的问题,但我自己无法弄明白。

所以,我试图将lambda传递给以下函数:

select coalesce(checkby, 'Total') as checkby_or_total,
       fully,
       faulty,
       lasthour, 
       total 
from   (
        select   qcheck.checkby,
                 count(case result when 'fully tested & working' then 1 end)     as fully,
                 count(case result when 'faulty' then 1 end)                     as faulty,
                 count(case when finishdate >= now()-interval 1 hour then 1 end) as lasthour,
                 count(*) as total 
        from     qcheck
        where    date(finishdate) = CURDATE() 
        and      qcheck.checkby not like 'michael' 
        and      qcheck.checkby not like 'chaz'
        group by qcheck.checkby with rollup
        ) as main
order by    checkby is null, 
            total desc 

......结果如下:

wiringPiISR(int pin, int mode, void (*function)())

......似乎有效,所以我显然可以使用lambda而不是指向函数。

但我真正想要做的就是这样,通过捕获wiringPiISR(Pin::BELL, INT_EDGE_RISING, [] {}); 来访问外部上下文中的函数this

onInterrupt(Pin pin)

...导致此错误消息的原因是什么:

wiringPiISR(Pin::BELL_1, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_1);
});

wiringPiISR(Pin::BELL_2, INT_EDGE_RISING, [this] { 
    onInterrupt(Pin::BELL_2);
});

我在使用c ++ - lambdas方面不是很有经验,我知道来自许多其他语言的闭包,但它们在c ++中显然有所不同。这个捕获似乎修改了闭包的签名,但我不知道如何解决这个问题,或者即使有一个可能的解决方案而没有指向"实际的"功能

提前谢谢

1 个答案:

答案 0 :(得分:2)

如果没有捕获(并按照规定捕获this),C ++ lambdas只能转换为函数指针。

另请参阅draft C++11 standard部分5.1.2

  

没有lambda-capture 的lambda表达式的闭包类型有一个   公共非虚拟非显式const 转换函数到指针   使用具有与闭包相同的参数和返回类型   type的函数调用操作符。

作为解决方案,您可以使用std::function代替函数指针。