#include <memory>
#include <iostream>
template<typename T, typename D>
class ptrptr_type {
using parent_type = std::unique_ptr<T, D>;
using pointer = typename parent_type::pointer;
parent_type* p;
pointer a;
ptrptr_type(const ptrptr_type& nocopy) = delete;
ptrptr_type& operator=(const ptrptr_type& nocopy) = delete;
public:
ptrptr_type(std::unique_ptr<T, D>& ptr) : p(&ptr), a(ptr.release()) {}
ptrptr_type(ptrptr_type&& mover) {p = mover.p; a = mover.a; mover.p = nullptr;}
ptrptr_type& operator=(ptrptr_type&& mover) {p = mover.p; a = mover.a; mover.p = nullptr; return *this;}
~ptrptr_type () {if (p) p->reset(a);}
operator pointer*() {return &a;}
};
template<typename T, typename D>
ptrptr_type<T,D> ptrptr(std::unique_ptr<T, D>& ptr) {return ptrptr_type<T, D>(ptr);}
void COMInitializeThingy ( int** cominitializegogo ) {delete *cominitializegogo; *cominitializegogo = new int(48);}
int main () {
std::unique_ptr<int> meow( new int(24) );
COMInitializeThingy ( ptrptr(meow) );
std::cout << *meow << std::endl;
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEQ+CmNsYXNzIHB0cnB0cl90eXBlIHsKICAgIHVzaW5nIHBhcmVudF90eXBlICA9IHN0ZDo6dW5pcXVlX3B0cjxULCBEPjsKICAgIHVzaW5nIHBvaW50ZXIgICAgICA9IHR5cGVuYW1lIHBhcmVudF90eXBlOjpwb2ludGVyOwogICAgCiAgICBwYXJlbnRfdHlwZSogcDsKICAgIHBvaW50ZXIgYTsKICAgIHB0cnB0cl90eXBlKGNvbnN0IHB0cnB0cl90eXBlJiBub2NvcHkpID0gZGVsZXRlOwogICAgcHRycHRyX3R5cGUmIG9wZXJhdG9yPShjb25zdCBwdHJwdHJfdHlwZSYgbm9jb3B5KSA9IGRlbGV0ZTsKcHVibGljOgogICAgcHRycHRyX3R5cGUoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+JiBwdHIpIDogcCgmcHRyKSwgYShwdHIucmVsZWFzZSgpKSB7fSAgCiAgICBwdHJwdHJfdHlwZShwdHJwdHJfdHlwZSYmIG1vdmVyKSB7cCA9IG1vdmVyLnA7IGEgPSBtb3Zlci5hOyBtb3Zlci5wID0gbnVsbHB0cjt9CiAgICBwdHJwdHJfdHlwZSYgb3BlcmF0b3I9KHB0cnB0cl90eXBlJiYgbW92ZXIpIHtwID0gbW92ZXIucDsgYSA9IG1vdmVyLmE7IG1vdmVyLnAgPSBudWxscHRyOyByZXR1cm4gKnRoaXM7fQogICAgfnB0cnB0cl90eXBlICgpIHtpZiAocCkgcC0+cmVzZXQoYSk7fQogICAgb3BlcmF0b3IgcG9pbnRlciooKSB7cmV0dXJuICZhO30gICAgICAgICAKfTsKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRD4KcHRycHRyX3R5cGU8VCxEPiBwdHJwdHIoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+JiBwdHIpIHtyZXR1cm4gcHRycHRyX3R5cGU8VCwgRD4ocHRyKTt9Cgp2b2lkIENPTUluaXRpYWxpemVUaGluZ3kgKCBpbnQqKiBjb21pbml0aWFsaXplZ29nbyApIHtkZWxldGUgKmNvbWluaXRpYWxpemVnb2dvOyAqY29taW5pdGlhbGl6ZWdvZ28gPSBuZXcgaW50KDQ4KTt9CgppbnQgbWFpbiAoKSB7ICAgIAogICAgc3RkOjp1bmlxdWVfcHRyPGludD4gbWVvdyggbmV3IGludCgyNCkgKTsgICAgCiAgICBDT01Jbml0aWFsaXplVGhpbmd5ICggcHRycHRyKG1lb3cpICk7ICAgIAogICAgc3RkOjpjb3V0IDw8ICptZW93IDw8IHN0ZDo6ZW5kbDsKfQ==