#include <iostream>
#include <memory>
using namespace std;
template <typename T>
struct Destroy {
void operator()(T *t) const {
t->destroy();
}
};
class IRuntime {
public:
virtual ~IRuntime() = default;
virtual void destroy() = 0;
};
class IRuntimeImpl : public IRuntime {
public:
IRuntimeImpl() {
cout << "created " << this << endl;
}
~IRuntimeImpl() override {
cout << "destroyed " << this << endl;
}
void destroy() override {
delete this;
}
};
IRuntime* createIRuntime() {
return new IRuntimeImpl;
}
class Test {
std::unique_ptr<IRuntime, Destroy<IRuntime>> runtime;
public:
Test() {
runtime.reset(createIRuntime());
}
};
int main() {
std::unique_ptr<IRuntime, Destroy<IRuntime>> runtime(createIRuntime());
Test{};
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBEZXN0cm95IHsKCXZvaWQgb3BlcmF0b3IoKShUICp0KSBjb25zdCB7CgkJdC0+ZGVzdHJveSgpOwoJfQp9OwoKY2xhc3MgSVJ1bnRpbWUgewpwdWJsaWM6Cgl2aXJ0dWFsIH5JUnVudGltZSgpID0gZGVmYXVsdDsKCXZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOwp9OwoKY2xhc3MgSVJ1bnRpbWVJbXBsIDogcHVibGljIElSdW50aW1lIHsKcHVibGljOgoJSVJ1bnRpbWVJbXBsKCkgewoJCWNvdXQgPDwgImNyZWF0ZWQgIiA8PCB0aGlzIDw8IGVuZGw7Cgl9CgoJfklSdW50aW1lSW1wbCgpIG92ZXJyaWRlIHsKCQljb3V0IDw8ICJkZXN0cm95ZWQgIiA8PCB0aGlzIDw8IGVuZGw7Cgl9CgoJdm9pZCBkZXN0cm95KCkgb3ZlcnJpZGUgewoJCWRlbGV0ZSB0aGlzOwoJfQp9OwoKSVJ1bnRpbWUqIGNyZWF0ZUlSdW50aW1lKCkgewoJcmV0dXJuIG5ldyBJUnVudGltZUltcGw7Cn0KCmNsYXNzIFRlc3QgewoKCXN0ZDo6dW5pcXVlX3B0cjxJUnVudGltZSwgRGVzdHJveTxJUnVudGltZT4+IHJ1bnRpbWU7CgpwdWJsaWM6CglUZXN0KCkgewoJCXJ1bnRpbWUucmVzZXQoY3JlYXRlSVJ1bnRpbWUoKSk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6dW5pcXVlX3B0cjxJUnVudGltZSwgRGVzdHJveTxJUnVudGltZT4+IHJ1bnRpbWUoY3JlYXRlSVJ1bnRpbWUoKSk7CglUZXN0e307CglyZXR1cm4gMDsKfQ==