2012-04-12 51 views
7

Tôi có danh sách các weak_ptrs mà tôi đang sử dụng để theo dõi các đối tượng. Tại một thời điểm nhất định, tôi muốn xóa một mục khỏi danh sách được chia sẻ shared_ptr hoặc weak_ptr.xóa mục khỏi danh sách weak_ptrs

#include <list> 

int main() 
{ 
typedef std::list< std::weak_ptr<int> > intList; 

std::shared_ptr<int> sp(new int(5)); 
std::weak_ptr<int> wp(sp); 

intList myList; 
myList.push_back(sp); 

//myList.remove(sp); 
//myList.remove(wp); 
} 

Tuy nhiên, khi tôi bỏ ghi chú dòng trên, chương trình sẽ không xây dựng:

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion) 

Làm thế nào để loại bỏ một mục từ danh sách được đưa ra một shared_ptr hoặc một weak_ptr?

Trả lời

6

Không có toán tử == cho con trỏ yếu. Bạn có thể so sánh shared_ptrs điểm weak_ptrs của bạn với.
Ví dụ như thế này.

myList.remove_if([wp](std::weak_ptr<int> p){ 
    std::shared_ptr<int> swp = wp.lock(); 
    std::shared_ptr<int> sp = p.lock(); 
    if(swp && sp) 
     return swp == sp; 
    return false; 
}); 
+2

Có một 'owner_before' Mặc dù vậy, mà thực hiện một order.So phần bạn cũng có thể viết lambda như '[wp] (std :: weak_ptr p) {return! (P.owner_before (wp) || wp.owner_before (p)); '- không cần khóa. Ngoài ra, trong mã của bạn tôi nghĩ bạn đã bỏ lỡ trường hợp 'swp == sp == 0'. – MSalters

+0

Có cách nào để làm điều này mà không có một lambda? Tôi sẽ xóa các mục ở nhiều nơi khác nhau. Tôi thấy rằng vị từ remove_if được gọi trên từng phần tử riêng lẻ nhưng tôi sẽ cần so sánh 2 con trỏ như bạn có ở trên. – user987280

+0

@ user987280 Chắc chắn bạn có thể sử dụng hàm functor hoặc một hàm miễn phí thay vì một lambda. Nhưng chính xác thì vấn đề mà vị từ được gọi cho từng phần tử là gì? – mkaes

Các vấn đề liên quan