#include <boost/move/utility_core.hpp>
class Base
{
BOOST_COPYABLE_AND_MOVABLE(Base)
public:
Base(){}
Base(const Base &) {}
Base(BOOST_RV_REF(Base) ) {}
Base& operator=(BOOST_RV_REF(Base) )
{ return *this;}
Base& operator=(BOOST_COPY_ASSIGN_REF(Base) )
{ return *this;}
virtual Base *clone() const
{ return new Base(*this); }
virtual ~Base(){}
};
class Member
{
BOOST_COPYABLE_AND_MOVABLE(Member)
public:
Member(){}
Member(BOOST_RV_REF(Member)) {}
Member &operator=(BOOST_RV_REF(Member)) { return *this; }
Member &operator=(BOOST_COPY_ASSIGN_REF(Member)) { return *this; }
};
class Derived : public Base
{
BOOST_COPYABLE_AND_MOVABLE(Derived)
Member mem_;
public:
Derived(){}
Derived(BOOST_RV_REF(Derived) x) : Base(BOOST_MOVE_BASE(Base, x)),
mem_(boost::move(x.mem_)) { }
Derived& operator=(BOOST_RV_REF(Derived) x) {
Base::operator=(BOOST_MOVE_BASE(Base, x));
mem_ = boost::move(x.mem_);
return *this;
}
Derived& operator=(BOOST_COPY_ASSIGN_REF(Derived) x) {
Base::operator=(x);
mem_ = x.mem_;
return *this;
}
};
template <class T>
class clone_ptr
{
private:
BOOST_COPYABLE_AND_MOVABLE(clone_ptr)
T* ptr;
public:
explicit clone_ptr(T* p = 0) : ptr(p) {}
~clone_ptr() { delete ptr; }
clone_ptr(const clone_ptr& p) : ptr(p.ptr ? p.ptr->clone() : 0) {}
clone_ptr& operator=(BOOST_COPY_ASSIGN_REF(clone_ptr) p) {
if (this != &p){
T *tmp_p = p.ptr ? p.ptr->clone() : 0;
delete ptr;
ptr = tmp_p;
}
return *this;
}
clone_ptr(BOOST_RV_REF(clone_ptr) p) : ptr(p.ptr) { p.ptr = 0; }
clone_ptr& operator=(BOOST_RV_REF(clone_ptr) p) {
if (this != &p){
delete ptr;
ptr = p.ptr;
p.ptr = 0;
}
return *this;
}
};
int main()
{
{
clone_ptr<Base> p1(new Derived());
clone_ptr<Base> p2 = p1; }
{
clone_ptr<Base> p1(new Derived());
clone_ptr<Base> p2 = boost::move(p1); p2 = clone_ptr<Base>(new Derived()); }
Derived d;
Derived d2(boost::move(d));
d2 = boost::move(d);
return 0;
}