将SFML的RenderWindow对象传递到模板功能

Pass a RenderWindow object of SFML to a template function

本文关键字:功能 SFML RenderWindow 对象      更新时间:2023-10-16

我是新手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;
}

您需要将中断语句从函数移动到交换机中的情况并正确使用sf::Event::EventType枚举:

#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功能可以参考sf::windowsf::Windowsf::RenderWindow一起使用:

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