저는 간단하지만 유연한 이벤트 시스템을 프로그래밍하려고합니다. (대부분 운동과 마찬가지로, 정말 좋은 이벤트 핸들러가있는 기존 라이브러리가 있다는 것을 알고 있습니다.) 저는 약간의 걸림돌을 겪었습니다.전화하기 전에 std :: function의 유효성을 확인 하시겠습니까?
대리자 (아마도 std :: bind를 사용하여 lambda를 통해 가능)를 통해 std::function
이 유효한 함수인지/멤버 함수의 개체가 호출되기 전에 여전히 해당 개체가 있는지 확인할 수 있습니까? 나는 단순히 std::function's
bool 연산자를 사용해 보았지만 아무런 성공도 거두지 못했습니다.
이상적으로 A. 델리게이트 함수 내부가 아닌 다른 곳에서 검사를하고 싶습니다. 그리고 체크되고있는 std :: function이 델리게이트가 아닐 때 여전히 유효합니다.
아이디어가 있으십니까? 편집
: 여기 내가 대신 벌거 벗은 사람의 당신은 스마트 포인터 (std::shared_ptr
/std::weak_ptr
)를 사용할 수 있습니다
#include <iostream>
#include <string>
#include <functional>
class Obj {
public:
std::string foo;
Obj(std::string foo) : foo(foo) {}
std::function<void()> getDelegate() {
auto callback = [this]() {this->delegatedFn();};
return callback;
}
void delegatedFn() {
std::cout << foo << std::endl;
}
};
int main() {
Obj* obj = new Obj("bar");
std::function<void()> callback = obj->getDelegate();
callback();
delete obj;
//perform some type of check here whether function is valid, without needing to know whether the function is a delegate or not
if(callback) {
std::cout << "Callback is valid" << std::endl; //callback is still considered valid after obj is deleted
callback(); //no exception thrown, prints a random series of characters
}
else {
std::cout << "Callback is invalid" << std::endl;
}
return 0;
}
시도해 보셨습니까? 바람직하게는 [Minimal, Complete, and Verifiable Example] (http://stackoverflow.com/help/mcve). 또한 오류를 포함하십시오. –
임의의 포인터가 여전히 유효한 개체를 가리키는 지 확인할 수 없으며 사용 사례가 동일한 것으로 줄어 듭니다. –
당신의 예제 코드를 보았을 때, 이것은'Obj' 클래스가'foo' 멤버 변수에 대한 포인터를 리턴 한 함수를 가지고 있고' obj'가 삭제되었습니다. 가능한 유일한 방법은 직접 추적하는 것입니다. 라이브러리 또는 컴파일러가 여기에서 도움을 줄 수있는 "마법"은 없습니다. –