좋아,이 간단해야, 기본적으로 아래의 예는 (적어도 컴파일) 을 일해야 : 클로저를«클래스 메서드 포인터»로 제공 하시겠습니까?
class Foo {
public:
void DoNothing(void(Foo::*funcptr)()){}
void CallDoNothing();
};
void Foo::CallDoNothing(){
auto closure = [this](){};
DoNothing(closure);
}
int main(){
return 0;
}
그러나
컴파일 오류를test.cpp: In member function ‘void Foo::CallDoNothing()’:
test.cpp:9:19: error: no matching function for call to ‘Foo::DoNothing(Foo::CallDoNothing()::__lambda0&)’
DoNothing(closure);
^
test.cpp:9:19: note: candidate is:
test.cpp:3:7: note: void Foo::DoNothing(void (Foo::*)())
void DoNothing(void(Foo::*funcptr)()){}
^
test.cpp:3:7: note: no known conversion for argument 1 from ‘Foo::CallDoNothing()::__lambda0’ to ‘void (Foo::*)()’
내가 트리거 몇 가지 이유 이미 캐스팅을 시도해 보았습니다. DoNothing(reinterpret_cast< void(Foo::*funcptr)() >(closure));
, DoNothing((void(Foo::*funcptr)())closure);
에 약간의 변형이 추가되었습니다.이 모든 것이 컴파일 오류를 유발했습니다.
캡쳐 된 람다는 멤버 함수 포인터는 물론 함수 포인터로 변환 될 수 없습니다. – user657267
@ user657267 글쎄, 이것이 정말로 슬픈 일이라면, 이것은 매우 슬픈 일이다. 그렇다면 클로저 (즉, 로컬 변수가 포착 된 람다)를 받아들이는 인수를 어떻게 선언 할 수 있습니까? –
'std :: function ' –
user657267