Связывать переменную-член шаблона только при создании экземпляра функции - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь реализовать лучшее обнаружение состояния ключа в классе-оболочке для окна GLFW.Мне нужно было убедиться, что если бы мое состояние клавиши постоянно задавалось как нажатое, определенные действия не запускались бы повторно.Таким образом, я заключил в себе идею триггеров подъема, опускания, пола и потолка.Проблема в том, что мне не обязательно нужны все триггеры для всех скомпилированных частей кода.поэтому я пришел к следующему решению:

class Window{
public:
GLFWwindow *m_window_ptr = nullptr;
//...
bool isKeyPressed(int key) const{
    return glfwGetKey(m_window_ptr, key) == GLFW_PRESS;
}

bool isKeyReleased(int key) const{
    return glfwGetKey(m_window_ptr, key) == GLFW_RELEASE;
}
enum class KeyState {
    pressed,
    released
};

enum class SignalEdge {
    rising,
    falling,
    floor,
    ceiling,
};

template<int key_t>
SignalEdge getKeyState() {
    static KeyState last_key_state = KeyState::released;
    switch (last_key_state) {
        case KeyState::released:
            if (isKeyPressed(key_t)) {
                last_key_state = KeyState::pressed;
                return SignalEdge::rising;
            } else {
                return SignalEdge::floor;
            }

            break;
        case KeyState::pressed:
            if (isKeyReleased(key_t)) {
                last_key_state = KeyState::released;
                return SignalEdge::falling;
            } else {
                return SignalEdge::ceiling;
            }
            break;
    }
}

template<int key_t>
bool isKeyRisingEdge() {
    return getKeyState<key_t>() == SignalEdge::rising;
}
};

Только чтобы понять, что мне понадобится это для каждого оконного объекта , поэтому статические переменные внутри каждого экземпляра шаблона getKeyState будут применяться к каждому окнув GLFW.

Мой единственный способ избежать этого - использовать переменные-члены для каждого типа шаблона ключа, но я не хочу тратить усилия на отображение каждого типа ключа в моем классе, просто чтобы установить переменную состояния для каждого из них.,Я хотел бы автоматически сопоставить переменные для каждого объекта с существованием данной шаблонной функции, то есть именно то, что я настроил здесь, но где состояние сохраняется для объекта окна GLFW.

Если я исключу ручное сопоставление целочисленных значений GLFW, я не уверен, что смогу сделать, я подумал о шаблонах переменных , но я и не вижу пути вперед в этом (как бы я имел переменную существовать только при создании экземпляра функции?).Единственный другой вариант, который я вижу, - это сохранение динамически размещенного массива состояний как статической переменной функции-члена, внутреннее сохранение увеличенного индекса для каждого объекта окна, используемого для индексации в массиве статических переменных, или выполнение противоположного действия сфункции, но это кажется грязным?Есть ли другой способ сделать это во время компиляции с помощью шаблонов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...