#include <cstdio>
#include <memory>
#define KNOTE(fmt, args...) ::printf(fmt "\n", ##args)
using namespace std;
class TBase
{
public:
TBase()
: IntValue(-1) {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
virtual ~TBase() {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
int IntValue;
};
class TDerived : public TBase
{
public:
TDerived() {
IntValue = 10;
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
virtual ~TDerived() {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
};
void TestUniquePtrCast()
{
std::unique_ptr<TBase> bp1(new TDerived);
// manully static cast, be careful!
std::unique_ptr<TDerived> dp1(static_cast<TDerived*>(bp1.release()));
// Now bp1 owns nothing
bp1 = std::move(dp1); // Now dp1 owns nothing
// manully dynamic cast, be careful!
std::unique_ptr<TDerived> dp2(dynamic_cast<TDerived*>(bp1.get()));
bp1.release(); // Now bp1 owns nothing
dp2->IntValue = 20;
}
int main()
{
TestUniquePtrCast();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KIAojZGVmaW5lIEtOT1RFKGZtdCwgYXJncy4uLikgOjpwcmludGYoZm10ICJcbiIsICMjYXJncykKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjbGFzcyBUQmFzZQp7CnB1YmxpYzoKVEJhc2UoKQo6IEludFZhbHVlKC0xKSB7CktOT1RFKCIlc0AlcDogJWQiLCBfX2Z1bmNfXywgdGhpcywgSW50VmFsdWUpOwp9CnZpcnR1YWwgflRCYXNlKCkgewpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQppbnQgSW50VmFsdWU7Cn07CiAKY2xhc3MgVERlcml2ZWQgOiBwdWJsaWMgVEJhc2UKewpwdWJsaWM6ClREZXJpdmVkKCkgewpJbnRWYWx1ZSA9IDEwOwpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQp2aXJ0dWFsIH5URGVyaXZlZCgpIHsKS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7Cn0KfTsKCnZvaWQgVGVzdFVuaXF1ZVB0ckNhc3QoKQp7CiAgc3RkOjp1bmlxdWVfcHRyPFRCYXNlPiBicDEobmV3IFREZXJpdmVkKTsKCiAgLy8gbWFudWxseSBzdGF0aWMgY2FzdCwgYmUgY2FyZWZ1bCEKICBzdGQ6OnVuaXF1ZV9wdHI8VERlcml2ZWQ+IGRwMShzdGF0aWNfY2FzdDxURGVyaXZlZCo+KGJwMS5yZWxlYXNlKCkpKTsKICAvLyBOb3cgYnAxIG93bnMgbm90aGluZwoKICBicDEgPSBzdGQ6Om1vdmUoZHAxKTsgLy8gTm93IGRwMSBvd25zIG5vdGhpbmcKCiAgLy8gbWFudWxseSBkeW5hbWljIGNhc3QsIGJlIGNhcmVmdWwhCiAgc3RkOjp1bmlxdWVfcHRyPFREZXJpdmVkPiBkcDIoZHluYW1pY19jYXN0PFREZXJpdmVkKj4oYnAxLmdldCgpKSk7CiAgYnAxLnJlbGVhc2UoKTsgLy8gTm93IGJwMSBvd25zIG5vdGhpbmcKCiAgZHAyLT5JbnRWYWx1ZSA9IDIwOwp9CgppbnQgbWFpbigpCnsKVGVzdFVuaXF1ZVB0ckNhc3QoKTsKcmV0dXJuIDA7Cn0=