Bonjour .

Voilà je cherche à utiliser un callback en C++ mais j'ai beaucoup de mal.

J'ai une classe qui initialise la bibliothèque GLFW (pour l'affichage OpenGL), et je veux lui attribuer un callback :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class MaClasse
{
MaClasse ();
~MaClasse ();
 
void AssignerCallback ();
}
Et la fonction AssignerCallback :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
glfwSetWindowSizeCallback (WindowSizeCallback);
Et le problème c'est justement cette fonction WindowSizeCallback. J'ai essayé de déclarer private statique la fonction WindowSizeCallback comme ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
static void GLFWCALL WindowSizeCallback (int width, int height);
Pas d'erreur à la compilation, mais la fonction n'est jamais appelée, donc j'en conclu que ce n'est pas comme ça. J'ai tenté de faire un extern "C" à l'intérieur de la classe mais ça ne fonctionne pas non plus. Je ne veux pas faire de l'héritage (je crois que c'est possible en dérivant des classes,...), et je crois que c'est possible avec boost mais j'ai un peu de mal.

J'ai essayé, en utilisant boost::function en créant une fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
boost::function <void (int width, int height)> WindowCallback;
puis une fonction statique :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
static void GLFWCALL MaFonction (int width, int height) {};
Et ensuite écrire dans la fonction AssignerCallback :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
WindowCallback = &MaFonction;
glfwSetWindowSizeCallback (WindowCallback);
Mais évidemment ça ne compile pas :/ : Erreur 1 error C2664: 'glfwSetWindowSizeCallback' : impossible de convertir le paramètre 1 de 'boost::function<Signature>' en 'GLFWwindowsizefun' d:\utilitaires\developpement\visual c++\projets\gamekult project\src\gkp_output.cpp 32



Bref, je demande donc votre aide. J'en suis sûr qu'il y a une méthode élégante de faire ça avec boost::function (boost::bind ?), mais j'avoue avoir un peu de mal :d.