#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(v) {}
Object(std::unique_ptr<T>&& v) : value(*v) {}
T* operator->() { return &value; }
private:
T value;
};
int main(int argc, char *argv[]) {
Object<Test> object1 = Test(1);
std::cout << object1->num << std::endl;
Object<Test> object2 = Test();
object2->num = 2;
std::cout << object2->num << std::endl;
Object<Test> object3 = std::make_unique<Test>(3);
std::cout << object3->num << std::endl;
Object<Test> object4 = std::make_unique<Test>();
object4->num = 4;
std::cout << object4->num << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgVGVzdCB7CnB1YmxpYzoKICAgIFRlc3QoKXt9CiAgICBUZXN0KGludCBuKSA6IG51bShuKSB7fQogICAgaW50IG51bTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIE9iamVjdCB7CnB1YmxpYzoKICAgIE9iamVjdChjb25zdCBUJiB2KSA6IHZhbHVlKHYpIHt9CiAgICBPYmplY3Qoc3RkOjp1bmlxdWVfcHRyPFQ+JiYgdikgOiB2YWx1ZSgqdikge30KCiAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJnZhbHVlOyB9CnByaXZhdGU6CiAgICBUIHZhbHVlOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewoKICAgIE9iamVjdDxUZXN0PiBvYmplY3QxID0gVGVzdCgxKTsKICAgIHN0ZDo6Y291dCA8PCBvYmplY3QxLT5udW0gPDwgc3RkOjplbmRsOwoKICAgIE9iamVjdDxUZXN0PiBvYmplY3QyID0gVGVzdCgpOwogICAgb2JqZWN0Mi0+bnVtID0gMjsKICAgIHN0ZDo6Y291dCA8PCBvYmplY3QyLT5udW0gPDwgc3RkOjplbmRsOwoKICAgIE9iamVjdDxUZXN0PiBvYmplY3QzID0gc3RkOjptYWtlX3VuaXF1ZTxUZXN0PigzKTsKICAgIHN0ZDo6Y291dCA8PCBvYmplY3QzLT5udW0gPDwgc3RkOjplbmRsOwoKICAgIE9iamVjdDxUZXN0PiBvYmplY3Q0ID0gc3RkOjptYWtlX3VuaXF1ZTxUZXN0PigpOwogICAgb2JqZWN0NC0+bnVtID0gNDsKICAgIHN0ZDo6Y291dCA8PCBvYmplY3Q0LT5udW0gPDwgc3RkOjplbmRsOwp9