首页 > 解决方案 > 将 SFML 的 RenderWindow 对象传递给模板函数

问题描述

我是新手 C++ 程序员,我不是专业人士。我对 C++ 中的模板感到很困惑。

我正在使用 SFML,我可以创建一个窗口并处理它。在下一步中,我决定编写一个模板函数来处理生成的关闭信号。但我的代码无法编译。问题出在哪里?

#include <SFML/Graphics.hpp>
#include <iostream>

template <typename T>
void EventHandler(T& window) {
    std::cout << "Close event is made." << std::endl;
    window.close();
    std::cout << "Window is closed succesfully." << std::endl;
    break;
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(512, 512), "SMFL Tutorial", sf::Style::Default);
    sf::Event events;

    while (window.isOpen())
    {
        while (window.pollEvent(events))
        {
            switch (events.type)
            {
            case events.Closed:
                EventHandler(window);
            default:
                std::cout << "Unkown Events are creating." << std::endl;
                break;
            }
        }
    }
    return 0;
}

标签: c++templatessfmltemplate-meta-programming

解决方案


您需要将 break 语句从您的函数移动到 switch 中的 case 并正确使用sf::Event::EventTypeenum :

#include <SFML/Graphics.hpp>
#include <iostream>

template <typename T>
void EventHandler(T& window) {
    std::cout << "Close event is made." << std::endl;
    window.close();
    std::cout << "Window is closed succesfully." << std::endl;
    /// break; <- From here
}

int main()
{
    sf::RenderWindow window(sf::VideoMode(512, 512), "SMFL Tutorial", sf::Style::Default);
    sf::Event events;

    while (window.isOpen())
    {
        while (window.pollEvent(events))
        {
            switch (events.type)
            {
            case sf::Event::Closed:
                EventHandler(window);
                break; /// <- To here
            default:
                std::cout << "Unkown Events are creating." << std::endl;
                break;
            }
        }
    }
    return 0;
}

此外,为什么需要模板函数?您的EventHandler函数可以引用 asf::window以使用sf::Windowand sf::RenderWindow

void EventHandler(sf::Window& window) {
    std::cout << "Close event is made." << std::endl;
    window.close();
    std::cout << "Window is closed succesfully." << std::endl;
}

推荐阅读