Re: Removing the assignable requirement from stl list elements
Carl Barron wrote:
Kevin Lin <kevin.ic@gmail.com> wrote:
I've been studying implementations of linked lists in sgi-stl and
updated versions in stlport, hoping to adapt one for my own needs. One
thing that caught my eye in the sgi implementation is the availability
of additional push_back and insert signatures in both list and slist:
void push_back();
void insert(iterator i);
To me this seems like a very reasonable extension that should allow:
typedef std::list< std::auto_ptr<int> > list_type;
list_type mylist;
list_type::iterator ptrIter = mylist.insert(mylist.begin());
ptrIter->reset(new int());
[...]
There are better and safer alternatives to using auto_ptr or even raw
ptrs in list. boost::shared_ptr and boost::intrusive_ptr if applicable
come to mind. TR1::shared_ptr as well.
what about
inline bool is_even(std::auto_ptr<int> x) {return !( *x & 1);}
list_type listing;
// fill it with the extension
iisting.remove_if(is_even);
All your even data is removed AND all the odd data is replaced by
auto_ptr<int>()!! essentially removed...Neat:(:(
[...]
The above case seems unrelated to the fact that the auto_ptrs are
inside a list. In other words:
std::auto_ptr<int> ptr(new int(4));
if(is_even(ptr))
{
int i = *ptr;
}
would fail in the same manner. The bug, of course, is that is_even
should be taking auto_ptr by const ref. While I agree that shared_ptr
is much safer and should be used when possible, I think we're being
sidetracked by a discussion on the merits of different smart pointers.
The reason I find the extension attractive is simply that allowing a
list of uncopyable objects seems useful. Leaving aside auto_ptr, a
better example might be:
struct nocopy : private boost::noncopyable {}; //no copy constructor
std::list<nocopy> mylist;
//fill
mylist.push_back();
Right now I don't see any compelling reason why such a creature
shouldn't be allowed.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]