2012-01-11 2 views
2

나는 Event 클래스가 있습니다. AddHandler(thisPtr, callback)에서 나는 thisPtrcallbacktr1::bind를 사용하고 결국 나는 목록이 있습니다C++ 이벤트에서 제거 처리기를 구현하는 방법

typedef std::tr1::function<void(int&)> CallbackFunction; 
std::list<CallbackFunction> m_handlers; 

을하지만 tr1::function는 비교 불가능한 경우 어떻게이 제거 처리기 메서드를 구현할 수있다?

개체 포인터와 콜백에서지도를 tr1::function으로 유지하고 동등한 개체 포인터와 콜백 포인터를 가진 포인터를 제거해야 RemoveHandler에 있습니까? 이것은 안전한 접근인가?

+0

아마 당신이해야 삽입 된 객체의 반복자를 리턴하면된다. 또한 Boost.Signals2, libsigC++ 등을 확인하십시오. – kennytm

답변

1

요소가 컨테이너에 남아있는 한 반복자를 무효화하지 않는 std :: list를 사용하므로 반복기를 사용하여 삽입 한 함수를 추적 할 수 있습니다. 예 : 이제

typedef std::list<CallbackFunction> func_list; 
typedef typename func_list::iterator func_it; 
func_it Insert(func_list & l, Callback c) 
{ 
    l.insert(l.begin(), c); 
    return l.begin(); 
} 

, 당신은 콜백을 삽입하는 함수를 호출 할 수 있으며,이 같은, 그것을 제거하는 데 사용할 수있는 그것, 그것을 반복자를 반환합니다

func_it it = Insert(l, c); 
l.erase(it); 
+0

사용자가 반복자를 저장하는 것을 원하지 않습니다. 'RemoveHandler (thisPtr, memberPtr)'에 주어진 정확한 반복자를 어떻게 찾습니까? – Leo

+0

@Leo :'std :: function'을 식별 할 수있는 방법이 필요합니다. 그리고 당신이 알고 있듯이, 당신은 함수 자체를 비교할 수 없습니다. 정수와 같은 유사한 값 (지도에있을 수 있음)을 가진 쌍으로 함수를 저장 한 다음 해당 값으로 함수를 조회 할 수 있습니다. 사용자는 나중에 함수를 식별하기 위해 해당 값을 저장해야합니다. 그것이 받아 들일 수 없다면, 나는 당신을 도울 해결책을 생각할 수 없다. –

+0

사용자가이 포인터와 멤버 함수 (C# 에서처럼) 이외의 것을 기억해야하는 이유는 무엇입니까? 이 두 값을 비교할 수 있습니까? – Leo

관련 문제