Итак, я работал над игровым движком, использующим OpenGL + GLFW. Первоначально я использовал обертки LWJGL и Java. Я решил портировать свою кодовую базу на C ++. Я использовал функцию "glfwSetCursorPosCallback" через лямбду, например:
//Java:
glfwSetCursorPosCallback(win, (window, xpos, ypos) -> {
engine.onCursorMoved(xpos, ypos);
});
Это позволило мне связать воедино все «события» в классе Engine и сохранить код установки GLFW + необработанный цикл обновления отдельно от остальной части кода двигателя. Оставляя класс Engine красивым и чистым.
Я хотел бы сделать то же самое, используя C ++, но следующее недопустимо:
glfwSetCursorPosCallback(window, [engine](GLFWwindow* window, double x, double y) {
engine.onCursorMoved(x, y);
});
В C ++ лямбда-выражениях вы не можете ничего передавать в блоке «[]», если лямбда-выражение используется в качестве параметра функции.
Так что я смотрел на это немного больше, чем на начальную проблему, я также читал, что при использовании лямбды производительность была хуже.
Поэтому я попытался передать функцию-член вместо параметра:
// I changed "onCursorMoved" use the proper parameter signature
// "onCursorMoved(GLFWwindow* window, double x, double y)"
glfwSetCursorPosCallback(window, engine.onCursorMoved);
Попытка также не удалась, поскольку вы не можете передать функцию-член экземпляров классов в качестве параметра glfwSetCursorPosCallback.
Итак, я спрашиваю, какой подход мне выбрать? Есть ли способы обойти ограничения лямбда / функции-члена или какой-то совершенно другой подход к этому, который я полностью упускаю?
P.S. - Я совершенно не практикуюсь с C ++, поэтому, пожалуйста, прости меня, если ответ очевиден.
Редактировать: чтобы проиллюстрировать / уточнить, чего я пытаюсь достичь, это Engine.h, основанный на моей предыдущей версии Java.
class Engine {
private:
//member variables for scene graph, etc
public:
Engine();
~Engine();
public:
void onWindowResized(int width, int height);
void onCursorMoved(double x, double y);
void onUpdate(float timeStep);
void onRender();
};
По существу, различные функции с префиксом «on» запускаются обратными вызовами / циклом GLFW в main, в том числе, потенциально. Является ли этот подход каким-то образом выполнимым, или есть лучший способ сделать это в C ++, исходящий из Java, где все находится в Objects, это неправильное мышление для этой ситуации?