Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::variant或std::optional时,SDL窗口将立即关闭_C++_Sdl_Optional_Variant - Fatal编程技术网

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

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

我正在尝试为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<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;
}