Реализация std :: equal с типами tr1 :: shared_ptr

Не могу легко найти решение онлайн …

У меня есть что-то похожее на следующее.

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, однако она не принимает шаблоны как свои собственные типы шаблонов.

0

Решение

Самый простой может быть в использовании 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));
2

Другие решения

Вы можете реализовать:

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

По вопросам рекламы [email protected]