Я пытаюсь зарегистрировать функцию-член класса как (обычную) функцию обратного вызова. Если я что-то не так понял, это должно быть возможно с помощью std::bind (с использованием С++ 11). Я делаю это следующим образом:
std::function<void (GLFWwindow*, unsigned int)> cb = std::bind(&InputManager::charInputCallback, this, std::placeholders::_1, std::placeholders::_2);
Моя функция обратного вызова определяется следующим образом:
void InputManager::charInputCallback(GLFWwindow* window, unsigned int key)
Я могу протестировать cb
сразу после создания, используя случайные данные:
cb(NULL, 0x62);
Я могу подтвердить, что эти данные правильно отправлены в функцию обратного вызова, распечатав ее на терминале.
Однако я хочу зарегистрировать эту функцию в GLFW, чтобы нажатия клавиш в окне программы отправлялись в функцию обратного вызова. Я делаю это так:
glfwSetCharCallback(window, (GLFWcharfun) &cb);
Как я уже говорил: вызов вручную работает просто отлично. Однако, когда я регистрирую его как обратный вызов, я получаю ошибку сегментации всякий раз, когда нажимаю клавишу, и GLFW пытается вызвать функцию обратного вызова.
Является ли std::bind не тем, что я ищу? Я использую его неправильно?
Изменить: я не думаю, что этот вопрос является дубликатом Как я могу передать функцию-член класса в качестве обратного вызова? как она была идентифицирована как. Пока мы решаем одну и ту же проблему, я спрашиваю об этом конкретном решении с использованием std::bind, которое только упоминается, но никогда не объясняется в одном из ответов на другой вопрос.
this
не остается волшебным образом только потому, что вы привязаны к обратному вызову. Если вы неправильно управляли временем жизни, вашInputManager
мог быть уничтожен к тому времени, когда GLFW вызовет обратный вызов. Это вызовет SegFault. Однако у SegFaults могут быть и другие причины — трудно сказать без минимального примера. - person MSalters   schedule 12.09.2016