2010-11-22 20 views
6

Recientemente tomé la decisión de cambiar un vector de punteros en un vector de punteros inteligentes, pero aunque estos punteros inteligentes son compatibles con STL, no pude convertir algunos algoritmos para usarlos .usando mem_fun() para contenedor de punteros inteligentes

Considérese una

class Base 
{ 
    ... 
    virtual bool valid(); 
}; 

¿Cómo convertir

bool is_any_valid(vector< Base* > v) 
{ 
    return v.end() != 
     find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

en esto?

bool is_any_valid(vector< my_smart_ptr<Base> v) 
{ 
    // mem_fun() fails, because valid() is not a member of my_smart_ptr<Base> !!! 
    // return v.end() != 
    // find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

Se puede suponer que my_smart_pointer <> tiene esencialmente la misma interfaz que shared_ptr <>, pero no puedo utilizar impulso en mi proyecto.

¿Hay algún adaptador (genérico) que pueda escribir para permitir que mem_fun o mem_fun_ref funcionen? miro preferiblemente para una solución en línea, como:

find_if(v.begin(), v.end(), mem_fun(some_adapter(&Base::valid))); 

porque hay muchos sucesos similares de tales líneas.

Respuesta

4

Desea utilizar boost mem_fn, ya que hace exactamente lo que desea. Mire este enlace, específicamente la sección PROPÓSITO.

http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html

Por cierto, usted debe estar pasando una referencia a const, y no todo el vector en is_any_valid (y su validez() debe ser const también).

+0

'mem_fn' también está disponible en MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –

+0

sí, exactamente lo que necesito. Solo (después de leer el código) no puedo entender por qué no han implementado la referencia a un caso sin const. –

Cuestiones relacionadas