#pragma once
#include <expected>
#include <wayland-server.h>
class Display
{
private:
struct wl_display *ptr;
public:
enum class Error
{
CannotCreateDisplay,
};
Display() = delete;
Display(struct wl_display *ptr)
: ptr{ptr}
{
}
Display(const Display &) = delete;
Display(Display &&) = delete;
Display &operator=(const Display &) = delete;
Display &operator=(Display &&) = delete;
~Display()
{
wl_display_destroy_clients(this->ptr);
wl_display_destroy(this->ptr);
}
static std::expected<Display, Error> create()
{
struct wl_display *ptr{wl_display_create()};
if (ptr == nullptr) {
return std::unexpected{Error::CannotCreateDisplay};
}
return {ptr};
}
};
我想将 Display(struct wl_display *)
构造函数设为私有,但我不能,因为否则
create
会抱怨找不到任何可行的构造函数来调用
Display
。我发现的一个解决方案是为
Display
创建一个移动构造函数,但是还有其他解决方案吗?
class Display
{
private:
struct wl_display *ptr;
Display(struct wl_display *ptr)
: ptr{ptr}
{
}
public:
enum class Error
{
CannotCreateDisplay,
};
Display() = delete;
Display(const Display &) = delete;
Display(Display &&) = delete;
Display &operator=(const Display &) = delete;
Display &operator=(Display &&) = delete;
~Display()
{
wl_display_destroy_clients(this->ptr);
wl_display_destroy(this->ptr);
}
static std::expected<Display, Error> create()
{
struct wl_display *ptr{wl_display_create()};
if (ptr == nullptr) {
return std::unexpected{Error::CannotCreateDisplay};
}
return {ptr}; // ERROR: can't find any viable constructor
}
};