无法在线轻松找到解决方案......
我有类似以下内容。
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_poin并比较对象字符串而不是它们的内存地址?我的第一种方法是编写一个自定义的std :: equal函数,但它不接受模板作为自己的模板类型。
答案 0 :(得分: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));
答案 1 :(得分: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 });