我正在尝试为SDL2应用程序创建一个简单的渲染器,并以为我也将NamedCache.size()
的{{1}}功能用作删除器,将SDL_*
资源包装在unique_ptr
中作为创建该渲染器的接口,该渲染器可以处理SDL_Destroy*
或std::variant
导致其正常失败的情况,即:
我的SDL渲染器是一个简单的类,具有布尔值和窗口的unique_ptr,例如:
std::optional
我只需在工厂方法中通过用using SDLWindowUptr = std::unique_ptr<SDL_Window,std::function<void(SDL_Window*)>>;
template <Value,Error>
using either = std::variant<Value,Error>;
enum class SDLRendererError {
SDLInitFailed,WindowCreationFailed
};
class SDLRenderer {
public:
static either<SDLRenderer,SDLRendererError> createRenderer();
private:
explicit SDLRenderer(SDLWindowUptr window):
_isRunning{false},_window{std::move(window)}
{}
public: // Allow moves,forbid copies
SDLRenderer(const SDLRenderer& other) = delete;
SDLRenderer(SDLRenderer&& other) = default;
SDLRenderer& operator=(const SDLRenderer& other) = delete;
SDLRenderer& operator=(SDLRenderer&& other) = default;
public:
int run();
private:
bool _isRunning;
SDLWindowUptr _window;
};
初始化SDL来初始化该类,然后创建一个SDL_Window,如果创建成功,我将其移入渲染器类:
SDL_INIT_VIDEO
在我的主语里:
either<SDLRenderer,SDLRendererError> SDLRenderer::createRenderer() {
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return SDLRendererError:SDLInitFailed;
}
auto windowUptr = SDLWindowUptr{
SDL_CreateWindow("Title",SDL_WINDOWPOS_CENTERED,1280,768,SDL_WINDOW_RESIZABLE),SDL_DestroyWindow
};
if (!windowUptr) {
return SDLRendererError::WindowCreationFailed;
}
return SDLRenderer{std::move(windowUptr)};
}
SDL初始化成功完成,窗口创建也成功完成。
现在,此代码实际上产生了一个应用程序,该应用程序在其中打开窗口然后立即关闭,并且主循环继续运行(仅检查auto result = SDLRenderer::createRenderer();
if (std::holds_alternative<SDLRenderer>(result) {
auto& renderer = std::get<SDLRenderer>(result);
return renderer.run();
}
就这样了),而SDL_PollEvent
则一直在弹出相同的错误消息:
事件系统已关闭
这是主循环的代码:
SDL_GetError
如果我在过程中不使用变体(或用法完全相同的可选变量),并且SDL端的初始化代码完全相同,那么一切运行都很好。
关于变量和可选项,或者我在变量/可选项中使用时实际上导致问题的代码,我遗漏了什么?