
Hi Because the operator== function compares pointers and not what they're pointing to this is what I've had to do to get it to find an integer. Basically I had to wrap the basic int type within another class called Int, as show below. class Int { private: shared_ptr<int> p; public: Int(int i) {p.reset(new int); *p = i;} bool operator==(const Int& r) {return *p.get() == *r.p.get();} ~Int() {}; }; void main() { vector < Int > vec; vec.push_back(Int(1)); vec.push_back(Int(2)); vec.push_back(Int(3)); Int p(4); if (find(vec.begin(), vec.end(), p) == vec.end()) { cout << "Couldn't find it"; } } Is there a better way that doesn't involve 1) having to write a wrapper class around a basic type (or any type) and 2) doesn't involve changing the shared_ptr::operator==. [Non-text portions of this message have been removed]

At 11:00 AM +1200 4/30/02, sashan wrote:
Is there a better way that doesn't involve 1) having to write a wrapper class around a basic type (or any type) and 2) doesn't involve changing the shared_ptr::operator==.
Do what you would do if the shared pointer were a real pointer. Create a functor and use std::find_if(). -- Jon Kalb Kalb@LibertySoft.com

Use std::find_if, and pass it a predicate function or function object. That is the standard way that you override the equality function if it doesn't do what you want. http://www.sgi.com/tech/stl/find_if.html This function object should work nicely: // warning unchecked code template<class T> struct DerefCompare { bool operator()(boost::shared_ptr<T> t) const { return ((*t)==val); } DerefCompare(T inVal):val(inVal){} T val; }; template <class T> DerefCompare<T> make_deref(T t) { return DerefCompare<T>(t); } Then to use it, use syntax like: std::find_if(vec.begin(),vec.end(),make_deref(5)); Johan --- sashan <sashang@ihug.co.nz> wrote:
Hi
Because the operator== function compares pointers and not what they're pointing to this is what I've had to do to get it to find an integer. Basically I had to wrap the basic int type within another class called Int, as show below.
class Int { private: shared_ptr<int> p;
public: Int(int i) {p.reset(new int); *p = i;} bool operator==(const Int& r) {return *p.get() == *r.p.get();} ~Int() {}; };
void main() { vector < Int > vec; vec.push_back(Int(1)); vec.push_back(Int(2)); vec.push_back(Int(3)); Int p(4); if (find(vec.begin(), vec.end(), p) == vec.end()) { cout << "Couldn't find it"; } }
Is there a better way that doesn't involve 1) having to write a wrapper class around a basic type (or any type) and 2) doesn't involve changing the shared_ptr::operator==.
[Non-text portions of this message have been removed]
__________________________________________________ Do You Yahoo!? Yahoo! Health - your guide to health and wellness http://health.yahoo.com
participants (3)
-
Johan Ericsson
-
Jon Kalb
-
sashan