2012-04-12 13 views
7

Ich habe eine Liste von weak_ptrs, die ich verwende, um Objekte zu verfolgen. Zu einem bestimmten Zeitpunkt möchte ich einen Eintrag aus der Liste entfernen, wenn shared_ptr oder weak_ptr angegeben wurde.Entfernen von Element aus der Liste der 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); 
} 

Allerdings, wenn ich die obigen Zeilen Kommentar-, wird das Programm nicht bauen:

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) 

Wie entferne ich ein Element aus der eine shared_ptr gegebenen Liste oder eine weak_ptr?

Antwort

6

Es gibt keinen Operator == für schwache Zeiger. Sie können die shared_ptrs vergleichen, auf die Ihr weak_ptrs verweist.
ZB wie folgt.

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

Es gibt ein 'owner_before', obwohl, die ein teilweise order.So implementiert schreiben Sie könnten auch das Lambda als' [wp] (std :: weak_ptr p) {return! (P.owner_before (wp) || wp.owner_before (p)); '- keine Sperre erforderlich. Auch in Ihrem Code haben Sie den "swp == sp == 0" Fall übersehen. – MSalters

+0

Gibt es eine Möglichkeit, dies ohne ein Lambda zu tun? Ich werde Gegenstände an vielen verschiedenen Orten entfernen. Ich sehe, dass das Prädikat remove_if für jedes Element einzeln aufgerufen wird, aber ich muss 2 Zeiger vergleichen, wie Sie oben haben. – user987280

+0

@ user987280 Sicher können Sie einen Funktor oder eine freie Funktion anstelle eines Lambda verwenden. Aber was genau ist das Problem, dass das Prädikat für jedes Element aufgerufen wird? – mkaes

Verwandte Themen