C++ 使用std::variant或std::optional时,SDL窗口将立即关闭
我正在尝试为SDL2应用程序创建一个简单的渲染器,我想尝试将C++ 使用std::variant或std::optional时,SDL窗口将立即关闭,c++,sdl,optional,variant,C++,Sdl,Optional,Variant,我正在尝试为SDL2应用程序创建一个简单的渲染器,我想尝试将SDL\u*资源包装在unique\u ptr中,并将其SDL\u Destroy*函数作为删除器,以及一个用于创建渲染器的接口,该接口可以处理使用std::variant或std::optional失败的情况,即: My SDL renderer是一个简单的类,具有一个布尔值和一个唯一的窗口,例如: using SDLWindowUptr = std::unique_ptr<SDL_Window, std::function&l
SDL\u*
资源包装在unique\u ptr
中,并将其SDL\u Destroy*
函数作为删除器,以及一个用于创建渲染器的接口,该接口可以处理使用std::variant
或std::optional
失败的情况,即:
My SDL renderer是一个简单的类,具有一个布尔值和一个唯一的窗口,例如:
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;
};
在我看来:
auto result = SDLRenderer::createRenderer();
if (std::holds_alternative<SDLRenderer>(result) {
auto& renderer = std::get<SDLRenderer>(result);
return renderer.run();
}
如果我在流程中不使用变量(或使用完全相同用法的可选变量),在SDL端使用完全相同的初始化代码,那么一切都可以正常运行
关于变体和可选项,或者在变体/可选项中使用时实际导致问题的代码,我遗漏了什么?您是否通过@KimKulling初始化了视频子系统?我正在使用SDL2(我可能应该提到它)。对于有变体和没有变体的两种方法,初始化代码完全相同。它适用于后一种情况,但不适用于前一种情况。我只是从旧版本复制粘贴。
auto result = SDLRenderer::createRenderer();
if (std::holds_alternative<SDLRenderer>(result) {
auto& renderer = std::get<SDLRenderer>(result);
return renderer.run();
}
int SDLRenderer::run()
{
auto event = SDL_Event{};
_isRunning = true;
// Main loop
while(_isRunning) {
while(SDL_PollEvent(&event)) {
onEvent(&event);
}
std::cout << "[Loop] SDL Error: " << SDL_GetError() << "\n";
SDL_Delay(200);
}
return 0;
}