2014-04-09 5 views
0

신호/슬롯 시스템에서 신호를 슬롯에 연결합니다. 슬롯은 범위, 인스턴스 포인터/멤버 함수 포인터 쌍, 함수 포인터에서 벗어날 수있는 람다 객체 일 수 있습니다. 후자의 슬롯은 무효화 될 수 없습니다.사라진 슬롯을 처리하는 방법

제 질문은 인스턴스 포인터/멤버 포인터 쌍과 람다 개체와 같이 무효화 될 수있는 슬롯을 다루는 방법입니다. 람다 객체를 복사 할 수는 있지만 무효화 된 객체 (예 : 인스턴스 포인터)를 여전히 캡처했을 수 있습니다.

답변

0

것은 창의력 : 당신이 캡처 된 값이 더 이상 유효하지 않습니다 여부를 사전에 통지하는 람다 함수에 대한 mutable 키워드를 이용 (읽기 전용 캡처 변수를 변경할 수)

#include <iostream> 
using namespace std; 

int main() { 

    int *num = new int(0x90); 

    auto lambda = [=] (bool ptrHasChanged = false) mutable { if(ptrHasChanged) num = new int(0x1); cout << *num << endl; if(ptrHasChanged) delete num;}; 

    lambda(); 

    delete num; 

    lambda(true); 

    return 0; 
} 

경우 수 클래스 객체를 캡쳐하고 멤버 변수 (항상 값으로 포인터를 캡처 했으므로 항상 참조로 사용)를 사용하면 스코프를 처리하는 것은 사용자의 책임입니다.

간단한 솔루션은 비용이 얼마인지 확실하지 않지만 필요한 경우 람다를 재생성하는 것입니다.