|
Boost : |
Subject: Re: [boost] [ptr_container] clone_ptr library
From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2010-05-19 08:29:47
raffimoni skrev:
> Hello everybody,
> I did not find any boost library that handle with a situation described
> below, so that I request for your comments. Is there any interest in
> such a library?
Seems like a useful tool.
> clone_ptr uses the same concept of cloning that ptr_containers do, so new_clone
> function should be defined for Base class, if it is not and clone_ptr< Base >
> points to some type that derives from Base, an appropriate assert will fail
> the same way it does with ptr_container. Defining new_clone for Base makes it
> cloneable for ptr_pointer and clone_ptr simultaneously.
>
> =====================
> SAMPLE IMPLEMENTATION
> =====================
>
> class clone_ptr
> {
> private:
> T* ptr_;
>
> public:
default constructor?
> explicit clone_ptr(T* ptr) throw():
> ptr_( ptr )
> {}
>
> ~clone_ptr() { delete ptr_; };
if( ptr_ )
delete_clone(ptr_);
(if-statement allows for better optimization)
> clone_ptr(const clone_ptr<T>& ptr)
>
Provide templated version also.
> ptr_ = new_clone( *ptr.ptr_ ); //default is defined in
> ptr_container library
ptr_ = new_clone( ptr.ptr_ );
?
> assert( typeid( *ptr_ ) == typeid( *ptr.ptr_ ) );
> }
>
> public:
> void reset( T* ptr = 0) throw()
> {
> if (ptr != ptr_)
> {
> delete ptr_;
> ptr_ = ptr;
> }
> }
if( ptr_ )
delete_clone(ptr_);
ptr_ = ptr;
> T* operator -> () const throw() { return ptr_; }
Please overload on const for a deep-copied object, same for operator()*
> };
>
> Of course this implementation is not complete. Notice
> the way copy constructor is implemented.
>
> =====================
> REMARKS
> =====================
>
> clone_ptr should definitely not be used with stl containers
> (e.g. stl::vector< clone_ptr< Base > >) because of performance,
> ptr_containers are the best way to achieve such functionality.
making the clone_ptr movable could make vector<clone_ptr<T>> ok.
-Thorsten
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk