#include <iostream>
#include <cstdio>
#include <memory>
using namespace std;
struct bus_t
{
bus_t()
{
cout << "bus_t()" << endl;
}
~bus_t()
{
cout << "~bus_t()" << endl;
}
};
int open_bus(bus_t **bus)
{
*bus = new bus_t;
return 0;
}
int free_bus(bus_t *bus)
{
delete bus;
}
struct bus_deleter
{
void operator()(bus_t *bus)
{
free_bus(bus);
}
};
int my_open_bus(unique_ptr<bus_t, bus_deleter> &bus)
{
bus_t *temp = nullptr;
int ret_code = open_bus(&temp);
bus = std::move(decltype(bus)(temp));
return ret_code;
}
bool foo()
{
unique_ptr<bus_t, bus_deleter> bus;
if(my_open_bus(bus) != 0)
{
return false;
}
// jeśli nie chcesz implementować własnego open_bus, to:
unique_ptr<bus_t, bus_deleter> bus2;
{
bus_t *bus_temp = nullptr;
if(open_bus(&bus_temp) != 0)
{
return false;
}
bus2 = decltype(bus2)(bus_temp);
}
}
int main() {
foo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGJ1c190CnsKCWJ1c190KCkKCXsKCQljb3V0IDw8ICJidXNfdCgpIiA8PCBlbmRsOwoJfQoJCgl+YnVzX3QoKQoJewoJCWNvdXQgPDwgIn5idXNfdCgpIiA8PCBlbmRsOwoJfQp9OwoKaW50IG9wZW5fYnVzKGJ1c190ICoqYnVzKQp7CgkqYnVzID0gbmV3IGJ1c190OwoJcmV0dXJuIDA7Cn0KCmludCBmcmVlX2J1cyhidXNfdCAqYnVzKQp7CglkZWxldGUgYnVzOwp9CgpzdHJ1Y3QgYnVzX2RlbGV0ZXIKewogIHZvaWQgb3BlcmF0b3IoKShidXNfdCAqYnVzKQogIHsKICAJZnJlZV9idXMoYnVzKTsKICB9Cn07CgppbnQgbXlfb3Blbl9idXModW5pcXVlX3B0cjxidXNfdCwgYnVzX2RlbGV0ZXI+ICZidXMpCnsKCWJ1c190ICp0ZW1wID0gbnVsbHB0cjsKCWludCByZXRfY29kZSA9IG9wZW5fYnVzKCZ0ZW1wKTsKCWJ1cyA9IHN0ZDo6bW92ZShkZWNsdHlwZShidXMpKHRlbXApKTsKCXJldHVybiByZXRfY29kZTsKfQoKYm9vbCBmb28oKQp7Cgl1bmlxdWVfcHRyPGJ1c190LCBidXNfZGVsZXRlcj4gYnVzOwoJaWYobXlfb3Blbl9idXMoYnVzKSAhPSAwKQoJewoJCXJldHVybiBmYWxzZTsKCX0KCQoJLy8gamXFm2xpIG5pZSBjaGNlc3ogaW1wbGVtZW50b3dhxIcgd8WCYXNuZWdvIG9wZW5fYnVzLCB0bzoKCXVuaXF1ZV9wdHI8YnVzX3QsIGJ1c19kZWxldGVyPiBidXMyOwoJewoJCWJ1c190ICpidXNfdGVtcCA9IG51bGxwdHI7CgkJaWYob3Blbl9idXMoJmJ1c190ZW1wKSAhPSAwKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlidXMyID0gZGVjbHR5cGUoYnVzMikoYnVzX3RlbXApOwoJfQp9CgppbnQgbWFpbigpIHsKCWZvbygpOwoJcmV0dXJuIDA7Cn0=