J'essaie d'enregistrer une fonction de membre de classe en tant que fonction de rappel (régulière). A moins d'avoir mal compris quelque chose, cela devrait être possible en utilisant std :: bind (en utilisant C++ 11). Je fais de la manière suivante:Enregistrement d'une fonction de membre de classe en tant que rappel d'une fonction à l'aide de std :: bind
std::function<void (GLFWwindow*, unsigned int)> cb = std::bind(&InputManager::charInputCallback, this, std::placeholders::_1, std::placeholders::_2);
Ma fonction de rappel est définie de la manière suivante:
void InputManager::charInputCallback(GLFWwindow* window, unsigned int key)
Je suis en mesure de tester cb
immédiatement après la création à l'aide des données aléatoires:
cb(NULL, 0x62);
Je peux confirmer que ces données sont envoyées correctement à la fonction de rappel en imprimant sur le terminal depuis l'intérieur.
Cependant, je souhaite enregistrer cette fonction dans GLFW afin que les pressions de touches de la fenêtre de programme soient envoyées à la fonction de rappel. Je fais comme ça:
glfwSetCharCallback(window, (GLFWcharfun) &cb);
Comme je l'ai déjà dit: l'appeler manuellement fonctionne très bien. Lorsque je l'enregistre comme rappel, j'obtiens une erreur de segmentation chaque fois que j'appuie sur une touche et que GLFW essaie d'appeler la fonction de rappel.
Est-ce que std :: bind n'est pas ce que je cherche? Est-ce que je l'utilise incorrectement?
Modifier: Je ne pense pas que cette question est un doublon de How can I pass a class member function as a callback? comme il a été identifié comme. Alors que nous nous attaquons au même problème, je pose une question à propos de cette solution particulière, en utilisant std :: bind, qui est seulement mentionné mais jamais expliqué dans l'une des réponses à l'autre question.
double possible de ([Comment puis-je passer une fonction de membre de classe comme un rappel?] Http: //stackoverflow.com/questions/400257/how-can-i-pass-a-class-member-function-as-a-callback) – Ari0nhh
C++ n'a pas de garbage collection. 'this' ne reste pas magiquement juste parce que vous avez lié à un rappel. Si vous n'avez pas géré correctement la durée de vie, votre InputManager peut avoir été détruit au moment où GLFW appelle le rappel. Cela provoquerait un SegFault. Cependant, SegFaults peut aussi avoir d'autres causes - difficile à dire sans un exemple minimal. – MSalters
@MSalters: Merci de le signaler, mais mon objet existe pour la durée de l'application entière. –