使用std :: variant或std :: optional时,SDL窗口立即关闭

我正在尝试为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端的初始化代码完全相同,那么一切运行都很好。

关于变量和可选项,或者我在变量/可选项中使用时实际上导致问题的代码,我遗漏了什么?

AAAGIS 回答:使用std :: variant或std :: optional时,SDL窗口立即关闭

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3078758.html

大家都在问