0

オンラインで簡単に解決策を見つけることができませんでした...

私は次のようなものを持っています。

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

その間、他の場所で...

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

std::find が実際に smart_pointers を参照し、メモリ アドレスではなくオブジェクト文字列を比較するようにするには、どうすればよいでしょうか? 私の最初のアプローチは、カスタム std::equal 関数を作成することでしたが、テンプレートを独自のテンプレート タイプとして受け入れません。

4

2 に答える 2

2

最も簡単に使用できるかもしれません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));
于 2012-10-30T22:42:14.453 に答える
1

以下を実装できます。

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

または、必要std::find_ifに応じて機能する述語を使用して実装することもできます。

C++11 では、次のようになります。

std::find_if( myVector.begin(), myVector.end(), [&](Color::Ptr & x) { return *p2 == *x });
于 2012-10-30T22:41:04.173 に答える