포함하는 것을 잊지, 당신은 어떤 weak_ptr를 위해 운영자 ==를 정의 할 수 있습니다. 이것이 구현되지 않은 이유가있을 것이라고 확신합니다. 아마도 나중에 추측 할 수 있습니다.
template <typename T>
bool operator == (const std::tr1::weak_ptr<T>& a, const std::tr1::weak_ptr<T>& b)
{
return a.lock() == b.lock();
}
... 평소처럼 remove()를 호출 할 수 있습니다. 이건 좀 극단적 인 것 같아.
struct EqPredicate
{
const boost::weak_ptr<Item>& theItem;
EqPredicate(const boost::weak_ptr<Item>& item) : theItem(item)
{
}
bool operator() (const boost::weak_ptr<Item>& p) const
{
return p.lock() == theItem.lock();
}
};
다음과 같이 사용 :
mylist.remove_if(EqPredicate(pItem));
그것을
당신이 remove_if() 접근 방식을 고수하는 경우, 당신은 함수 객체를 사용하여 바인드 마법 *의 제거 얻을 수 더 많은 코드처럼 보이지만 EqPredicate 클래스를 압축 할 수 있습니다. 또한 Item 이외의 유형을 포함하는 목록과 함께 사용하기 위해 템플릿을 만들 수 있습니다.
아, 비교 기능을 포함하여 어디서나 weak_ptrs를 참조로 전달해야합니다.
* 바인드는 성능면에서 무료가 아닙니다. 많은 Remove() 호출을 기대하고 성능을 많이 신경 쓰면 성능을 피하는 것이 좋습니다.
출처
2009-09-07 19:14:26
sbk
약 포인터가 가리키고 있기 때문에 잠글 수없는 경우 어떻게됩니까? – Omnifarious
sbk의 대답을 사용하여 p.lock()은 p에 shared_ptr을 반환합니다. p는 thisItem.lock()과 일치하지 않으므로 여전히 작동합니다. p.lock()은 결코 throw되지 않습니다. –