#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;
}