#include <iostream>
#include <memory>
class Test {
public:
Test(){}
Test(int n) : num(n) {}
int num;
};
template<typename T>
class Object {
public:
Object(const T& v) : value(std::make_shared(v)) {}
Object(std::unique_ptr<T>&& v) : value(std::move(v)) {}
T* operator->() { return value.get(); }
private:
std::shared_ptr<T> value;
};
int main(int argc, char *argv[]) {
Object<Test> object = std::make_unique<Test>();
object->num = 67;
std::cout << object->num << std::endl;
{
Object<Test> ot = object;
ot->num = 34;
}
std::cout << object->num << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgogCmNsYXNzIFRlc3QgewpwdWJsaWM6CiAgICBUZXN0KCl7fQogICAgVGVzdChpbnQgbikgOiBudW0obikge30KICAgIGludCBudW07Cn07CiAKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgT2JqZWN0IHsKcHVibGljOgogICAgT2JqZWN0KGNvbnN0IFQmIHYpIDogdmFsdWUoc3RkOjptYWtlX3NoYXJlZCh2KSkge30KICAgIE9iamVjdChzdGQ6OnVuaXF1ZV9wdHI8VD4mJiB2KSA6IHZhbHVlKHN0ZDo6bW92ZSh2KSkge30KCiAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gdmFsdWUuZ2V0KCk7IH0KcHJpdmF0ZToKICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiB2YWx1ZTsKfTsKIAppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAKIAogICAgT2JqZWN0PFRlc3Q+IG9iamVjdCA9IHN0ZDo6bWFrZV91bmlxdWU8VGVzdD4oKTsKICAgIG9iamVjdC0+bnVtID0gNjc7CiAgICBzdGQ6OmNvdXQgPDwgb2JqZWN0LT5udW0gPDwgc3RkOjplbmRsOwogCiAgICB7CiAgICAgICAgT2JqZWN0PFRlc3Q+IG90ID0gb2JqZWN0OwogICAgICAgIG90LT5udW0gPSAzNDsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBvYmplY3QtPm51bSA8PCBzdGQ6OmVuZGw7Cn0K