#include <iostream>
#include <algorithm>
class Base
{
protected:
std::string str;
void* ptr;
void swap(Base &a, Base &b)
{
using std::swap;
swap(a.ptr, b.ptr);
swap(a.str, b.str);
}
public:
Base(std::string str, void* ptr) : str(str), ptr(ptr) {}
Base(Base&& other) : str(), ptr(nullptr) {swap(other, *this);}
virtual ~Base() {}
};
class Derived : public Base
{
protected:
void* ptr2;
void swap(Derived &a, Derived &b)
{
using std::swap;
swap(a.ptr2, b.ptr2);
}
public:
Derived(std::string str, void* ptr, void* ptr2) : Base(str, ptr), ptr2(ptr2) {}
/** copy-swap idiom*/
Derived(Derived&& other) : Base(std::move(other)), ptr2(nullptr) {swap(other, *this);}
void Print() {std::cout<<Base::str<<" "<<(char*)Base::ptr<<" "<<(char*)ptr2<<"\n";}
};
int main()
{
char str[] = "100";
char str2[] = "200";
Derived d = Derived("100", &str[0], &str2[0]);
Derived d2 = std::move(d);
d2.Print();
//d.Print(); //Prints nothing.. it was moved..
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKY2xhc3MgQmFzZQp7Cglwcm90ZWN0ZWQ6CgkgICAgc3RkOjpzdHJpbmcgc3RyOwoJICAgIHZvaWQqIHB0cjsKCSAgICAKCSAgICB2b2lkIHN3YXAoQmFzZSAmYSwgQmFzZSAmYikKCSAgICB7CgkgICAgCXVzaW5nIHN0ZDo6c3dhcDsKCSAgICAJc3dhcChhLnB0ciwgYi5wdHIpOwoJICAgIAlzd2FwKGEuc3RyLCBiLnN0cik7CgkgICAgfQoJICAgIAoJcHVibGljOgoJCUJhc2Uoc3RkOjpzdHJpbmcgc3RyLCB2b2lkKiBwdHIpIDogc3RyKHN0ciksIHB0cihwdHIpIHt9CgkJQmFzZShCYXNlJiYgb3RoZXIpIDogc3RyKCksIHB0cihudWxscHRyKSB7c3dhcChvdGhlciwgKnRoaXMpO30KCQkKCQl2aXJ0dWFsIH5CYXNlKCkge30KfTsKCmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZQp7Cglwcm90ZWN0ZWQ6CgkJdm9pZCogcHRyMjsKCQkKCQl2b2lkIHN3YXAoRGVyaXZlZCAmYSwgRGVyaXZlZCAmYikKCQl7CgkJCXVzaW5nIHN0ZDo6c3dhcDsKCQkJc3dhcChhLnB0cjIsIGIucHRyMik7CgkJfQoJCQoJcHVibGljOgoJCURlcml2ZWQoc3RkOjpzdHJpbmcgc3RyLCB2b2lkKiBwdHIsIHZvaWQqIHB0cjIpIDogQmFzZShzdHIsIHB0ciksIHB0cjIocHRyMikge30KCgkJLyoqIGNvcHktc3dhcCBpZGlvbSovCgkJRGVyaXZlZChEZXJpdmVkJiYgb3RoZXIpIDogQmFzZShzdGQ6Om1vdmUob3RoZXIpKSwgcHRyMihudWxscHRyKSB7c3dhcChvdGhlciwgKnRoaXMpO30KCQkKCQl2b2lkIFByaW50KCkge3N0ZDo6Y291dDw8QmFzZTo6c3RyPDwiICAiPDwoY2hhciopQmFzZTo6cHRyPDwiICAiPDwoY2hhciopcHRyMjw8IlxuIjt9Cn07CgppbnQgbWFpbigpIAp7CgljaGFyIHN0cltdID0gIjEwMCI7CgljaGFyIHN0cjJbXSA9ICIyMDAiOwoJCglEZXJpdmVkIGQgPSBEZXJpdmVkKCIxMDAiLCAmc3RyWzBdLCAmc3RyMlswXSk7CgkKCURlcml2ZWQgZDIgPSBzdGQ6Om1vdmUoZCk7CglkMi5QcmludCgpOwoJCgkvL2QuUHJpbnQoKTsgIC8vUHJpbnRzIG5vdGhpbmcuLiBpdCB3YXMgbW92ZWQuLgoJCglyZXR1cm4gMDsKfQ==