#include <iostream>
#include <memory>
struct releaseable_object
{
releaseable_object() : dummy_ptr(new int) {}
void Release()
{
std::cout << "Releasing releaseable object\n";
delete dummy_ptr;
}
int *const dummy_ptr;
};
struct A : releaseable_object {};
struct B : releaseable_object {};
namespace factory
{
A *CreateA(/* lots of parameters */) { return new A; }
B *CreateB(/* lots of parameters */) { return new B; }
}
template <typename T> struct Managed
{
using type = T;
struct deleter {
void operator()(T* object) {
std::cout << "Release!\n";
object->Release();
}
};
using pointer = std::unique_ptr<T, deleter>;
};
struct ManagedA : Managed<A>
{
using base = Managed<A>;
using base::pointer;
ManagedA(/* lots of parameters */)
{
// do A specific stuff...
A *a = factory::CreateA(/* lots of parameters */);
// more A specific stuff...
// wrap the pointer:
m_pointer.reset(a);
}
pointer m_pointer;
};
int main()
{
std::cout << sizeof(void*) << '\n';
std::cout << sizeof(ManagedA::pointer) << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IHJlbGVhc2VhYmxlX29iamVjdAp7CglyZWxlYXNlYWJsZV9vYmplY3QoKSA6IGR1bW15X3B0cihuZXcgaW50KSB7fQoJdm9pZCBSZWxlYXNlKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIlJlbGVhc2luZyByZWxlYXNlYWJsZSBvYmplY3RcbiI7CgkJZGVsZXRlIGR1bW15X3B0cjsKCX0KCWludCAqY29uc3QgZHVtbXlfcHRyOwp9OwoKc3RydWN0IEEgOiByZWxlYXNlYWJsZV9vYmplY3Qge307CnN0cnVjdCBCIDogcmVsZWFzZWFibGVfb2JqZWN0IHt9OwoKbmFtZXNwYWNlIGZhY3RvcnkKewoJQSAqQ3JlYXRlQSgvKiBsb3RzIG9mIHBhcmFtZXRlcnMgKi8pIHsgcmV0dXJuIG5ldyBBOyB9CglCICpDcmVhdGVCKC8qIGxvdHMgb2YgcGFyYW1ldGVycyAqLykgeyByZXR1cm4gbmV3IEI7IH0KfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBNYW5hZ2VkCnsKCXVzaW5nIHR5cGUgPSBUOwoJc3RydWN0IGRlbGV0ZXIgewoJICB2b2lkIG9wZXJhdG9yKCkoVCogb2JqZWN0KSB7CgkJc3RkOjpjb3V0IDw8ICJSZWxlYXNlIVxuIjsKCQlvYmplY3QtPlJlbGVhc2UoKTsKCSAgfQoJfTsKCXVzaW5nIHBvaW50ZXIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgZGVsZXRlcj47Cn07CgpzdHJ1Y3QgTWFuYWdlZEEgOiBNYW5hZ2VkPEE+CnsKCXVzaW5nIGJhc2UgPSBNYW5hZ2VkPEE+OwoJdXNpbmcgYmFzZTo6cG9pbnRlcjsKCU1hbmFnZWRBKC8qIGxvdHMgb2YgcGFyYW1ldGVycyAqLykKCXsKCQkvLyBkbyBBIHNwZWNpZmljIHN0dWZmLi4uCgkJQSAqYSA9IGZhY3Rvcnk6OkNyZWF0ZUEoLyogbG90cyBvZiBwYXJhbWV0ZXJzICovKTsKCQkvLyBtb3JlIEEgc3BlY2lmaWMgc3R1ZmYuLi4KCgkJLy8gd3JhcCB0aGUgcG9pbnRlcjoKCQltX3BvaW50ZXIucmVzZXQoYSk7Cgl9Cglwb2ludGVyIG1fcG9pbnRlcjsKfTsKCmludCBtYWluKCkKewoJc3RkOjpjb3V0IDw8IHNpemVvZih2b2lkKikgPDwgJ1xuJzsKCXN0ZDo6Y291dCA8PCBzaXplb2YoTWFuYWdlZEE6OnBvaW50ZXIpIDw8ICdcbic7CglyZXR1cm4gMDsKfQ==