2012-07-06 6 views
5
class Widget; 

std::vector< std::shared_ptr<Widget> > container 

class Criterium 
{ 
public: 
    bool operator()(const Widget& left, const Widget& right)const; 
}; 

¿Cómo puedo ordenar el recipiente según el Criterium, sin definir otro criterio como:Cómo ordenar un contenedor de objetos std :: shared_ptr <Widget>?

class CriteriumForPointers 
{ 
public: 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const; 
}; 
+0

quiero decir, ¿hay algo de C++ 11 mágica que pueda usar? Defina algún objeto de función en la ejecución, justo antes del comando std :: sort, ... –

Respuesta

8

Se puede usar un lambda como una n adaptador:

Criterium criterium; 
sort(container.begin(), container.end(), 
    [&criterium] (const shared_ptr<Widget> &l, const shared_ptr<Widget> &r) 
    { 
     return criterium(*l.get(), *r.get()); 
    } 
); 
+0

¡Genial! ¡Eso es lo que estaba buscando, pero no era lo suficientemente inteligente como para inventarme! –

+0

Usar referencias de referencias a punteros compartidos en este caso, está haciendo copias/sincronizaciones innecesarias. – Klaim

+0

@Klaim: Obvio en retrospectiva, no sé por qué me perdí eso. Gracias por la noticia. – Jon

1

Tal vez usted podría poner un segundo sobrecarga del operador() en su Criterium-classe, como esto:

class Criterium { 
    bool operator()(const Widget& left, const Widget& right)const; 
    bool operator()(const std::shared_ptr<Widget>& left, 
        const std::shared_ptr<Widget>& right)const 
    { return operator()(*left, *right); } 
}; 

(nota: no he probado esto)

Cuestiones relacionadas