Вам необходимо пройти в функции указатель этого типа:
void (*)(GLFWindow*, double, double)
К сожалению, это не выглядит, как они дают вам место для любого вида контекста аргумента. Таким образом, один подход является глобальным обратного вызова подход:
struct MyCallback {
static MyClass* obj;
static void callback(GLFWindow* window, double a, double b) {
obj->mouseButtonChanged(window, double a, double b);
}
};
Используется как:
MyCallback::obj = &myObj;
glfwSetCursorPosCallback(window, &MyCallback::callback);
Это работает, потому что callback
в настоящее время не требует экземпляра. К сожалению, теперь у нас есть глобальный MyClass*
. Однако мы застряли в этом. Мы не можем использовать выражение std::bind()
или лямбда здесь, потому что что-либо с захватом не будет конвертируемым в указатель функции.
[обновление] Так как вы можете добавить void*
на window
, вы также можете сделать это:
glfwSetWindowUserPointer(window, &myObj);
glfwSetCursorPosCallback(window, +[](GLFWindow* win, double a, double b){
static_cast<MyClass*>(glfwGetWindowUserPointer(win))->mouseButtonChanged(win, a, b);
});
Где operator+
на лямбда, без захвата (например, один в этом случае) преобразует его в необработанный указатель функции.
То, что у вас нет механизма для указателя данных пользователя в этой функции, несколько удары. Может понадобиться статическая карта, доступная для обратного вызова, содержащего отображение вашего объекта GLWindow *. Было ли требование * * вызываемым * (что-то, что поддерживает функцию 'operator()'), я бы предложил решение 'std :: bind', но я не думаю, что оно будет работать в вашем случае. – WhozCraig
Спасибо, но у меня нет поддержки C++ 11. –
Вам не нужна поддержка C++ 11, если вы не используете 'std :: bind', и независимо от того, была ли вы или не поддерживала Ave C++ 11, это все равно не сработает для вас, поскольку Я упомянул выше. – WhozCraig