2016-06-18 2 views
0

이것은 꽤 멍청한 질문 일지 모르지만 나는 혼자서 그것을 알아낼 수 없었다.람다 (lambda) 내의 외부 상황에 접근하기

그래서, 나는 다음과 같은 기능에 람다를 전달하려고 :

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

... 무슨 일이 결과 :

wiringPiISR(Pin::BELL, INT_EDGE_RISING, [] {}); 

을 ... 그리고 작동하는 것 같다, 그래서 분명히 함수를 가리키는 대신 람다를 사용할 수 있습니다.

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

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

...이 오류 메시지에 어떤 결과 :

No matching function for call to wiringPiISR 

는하지만 실제로하고 싶은 외부 맥락에서 기능 onInterrupt(Pin pin)에 액세스 할 수 this을 캡처와 함께, 그 같은 것입니다

저는 C++을 사용하는 데 경험이 많지 않습니다 - lambdas, 다른 많은 언어의 클로저를 알고 있지만 분명히 C++에서 다르게 작동하는 것처럼 보입니다. 이 캡쳐는 클로저의 서명을 수정하는 것으로 보이지만이를 수정하는 방법이나 "실제"기능을 지정하지 않고도 가능한 해결책이 있는지는 잘 모릅니다.

는 더 캡처 가없는 경우

+0

'onInterrupt'가 멤버라고 가정합니다. 그러므로,'this-> onInterrupt (...)'를 시도해 보길 권합니다. 나는 컴파일러가 명시 적'this->'없이 컴파일 할 수없는 비슷한 동작을 보았다. –

+0

아니요, 이건 아무것도 바뀌지 않습니다. 이미 시도해 봤습니다. 오류 메시지를 올바르게 해석하면'wiringPiISR'이 클로저를 허용하지 않는 것처럼 보입니다. – andreaspfurtscheller

+0

죄송합니다. 처음 읽는 동안 함수 포인터를 지적하지 않았습니다. 이것은 약간 변합니다 (사실은 대답을 줄 것입니다). –

답변