2012-10-30 4 views
0

N'a pas pu trouver facilement une solution en ligne ...std :: égalité avec TR1 :: types de shared_ptr

J'ai quelque chose de similaire à ce qui suit.

class Color { 
    public: 
    Color(std::string n) : name(n) {} 
    typedef std::tr1::shared_ptr<Color> Ptr; 
    std::string name; 
}; 

quant à lui d'ailleurs ...

void Function() 
{ 
    std::vector<Color::Ptr> myVector; 
    Color::Ptr p1 = Color::Ptr(new Color("BLUE")); 
    Color::Ptr p2 = Color::Ptr(new Color("BLUE")); 

    // Note: p2 not added. 
    myVector.push_back(p1); 

    // This is where my predicament comes in.. 
    std::find(myVector.begin(), myVector.end(), p2); 
} 

Comment pourrais-je écrire ce donc mon std :: trouver serait en fait déférence les smart_pointers et comparer les chaînes d'objets plutôt que leurs adresses de mémoire? Ma première approche consistait à écrire une fonction std :: equal personnalisée mais elle n'acceptait pas les templates comme ses propres types de templates.

+0

Montrez-nous ce que vous avez essayé ... –

Répondre

2

peut être à Easiest utiliser find_if:

template <typename T> 
struct shared_ptr_finder 
{ 
    T const & t; 

    shared_ptr_finder(T const & t_) : t(t_) { } 

    bool operator()(std::tr1::shared_ptr<T> const & p) 
    { 
     return *p == t; 
    } 
}; 

template <typename T> 
shared_ptr_finder<T> find_shared(std::tr1::shared_ptr<T> const & p) 
{ 
    return shared_ptr_finder<T>(*p); 
} 

#include <algorithm> 

typedef std::vector< std::tr1::shared_ptr<Color> >::iterator it_type; 
it_type it1 = std::find_if(myVector.begin(), myVector.end(), find_shared(p2)); 
it_type it2 = std::find_if(myVector.begin(), myVector.end(), shared_ptr_finder<Color>(*p2)); 
+0

Merci, fonctionne parfaitement – bgura

1

Vous pouvez mettre en œuvre:

bool operator==(Color::Ptr const & a, Color::Ptr const & b); 

Ou, vous pouvez utiliser std::find_if et mettre en œuvre un prédicat qui fonctionnerait comme vous voulez.

En C++ 11, il pourrait ressembler à:

std::find_if(myVector.begin(), myVector.end(), [&](Color::Ptr & x) { return *p2 == *x }); 
+0

Si l'OP est à l'aide TR1, elle n'a probablement pas C++ 11. –

+0

@KerrekSB: Je suis d'accord. Cependant, il n'est pas trop difficile de convertir ce lambda en foncteur. –

Questions connexes