这可能是一个非常引人注目的问题,但我自己无法弄明白。
所以,我试图将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 ++中显然有所不同。这个捕获似乎修改了闭包的签名,但我不知道如何解决这个问题,或者即使有一个可能的解决方案而没有指向"实际的"功能
提前谢谢
答案 0 :(得分:2)
如果没有捕获(并按照规定捕获this
),C ++ lambdas只能转换为函数指针。
另请参阅draft C++11 standard部分5.1.2
:
没有lambda-capture 的lambda表达式的闭包类型有一个 公共非虚拟非显式const 转换函数到指针 使用具有与闭包相同的参数和返回类型 type的函数调用操作符。
作为解决方案,您可以使用std::function
代替函数指针。