2012-07-06 10 views
5
class Widget; 

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

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

Jak mogę posortować pojemnik według kryterium, bez zdefiniowania innego criterium jak:Jak sortować kontener obiektów std :: shared_ptr <Widget>?

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

Znaczy się, czy istnieje jakiś C++ 11 magia mogę używać? Zdefiniuj jakiś obiekt funkcji w biegu, tuż przed poleceniem std :: sort, ... –

Odpowiedz

8

można użyć lambda jako n adapter:

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

Cool! Tego właśnie szukałem, ale nie był wystarczająco inteligentny, by się wymyślić! –

+0

Używaj w tym przypadku odniesień do wskaźników współdzielonych, robisz zbędne kopie/synchronizacje. – Klaim

+0

@Klaim: Oczywiście z perspektywy czasu, nie wiem, dlaczego to przegapiłem. Dzięki za powiadomienie. – Jon

1

Może można umieścić drugą przeciążenie operatora() do swojej Criterium-Classe, jak to:

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); } 
}; 

(uwaga: nie testowałem tego)

Powiązane problemy