2012-04-12 9 views
7

Tengo una lista de weak_ptrs que estoy usando para hacer un seguimiento de los objetos. En un cierto punto, me gustaría eliminar un elemento de la lista dado un shared_ptr o un weak_ptr.eliminando el elemento de la lista de 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); 
} 

Sin embargo, cuando me descomentar las líneas anteriores, el programa no va a construir:

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) 

¿Cómo se quita un elemento de la lista dada una shared_ptr o una weak_ptr?

Respuesta

6

No hay operador == para punteros débiles. Podría comparar los puntos compartidos a los que apunta su punto_de_depósito.
Le gusta esto.

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

Hay un 'owner_before', sin embargo, que implementa un order.So parcial también se puede escribir la lambda como' [WP] (std :: weak_ptr p) {return! (P.owner_before (WP) || wp.owner_antes (p)); '- no se necesita bloqueo. Además, en tu código creo que te perdiste el caso 'swp == sp == 0'. – MSalters

+0

¿Hay alguna manera de hacer esto sin una lambda? Estaré quitando artículos en muchos lugares diferentes. Veo que se llama al predicado remove_if en cada elemento individualmente, pero tendré que comparar 2 punteros como los que tiene arriba. – user987280

+0

@ user987280 Seguro que puedes usar un functor o una función gratuita en lugar de un lambda. Pero, ¿cuál es exactamente el problema que recibe el predicado para cada elemento? – mkaes

Cuestiones relacionadas