Bonjour à tous

Je me pose la question suivante (y'a des matins comme ça ) :

Est-il possible de passer une fonction membre non static en paramètre d'une fonction, pour un appel de callback déclarée en "cdecl".
J'utilise souvent ce mécanisme avec boost::function et boost::bind... Alors je me dis : ça ne coute rien d'essayer... (Ca serait pratique de pouvoir câbler ses callbacks de cette manière avec GLUT par exemple...)

Résultat :

Voici un code minimal :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
#define BOOST_MEM_FN_ENABLE_CDECL
 
#include <boost/function.hpp>
#include <boost/bind.hpp>
 
class A {
public:
 
  typedef boost::function<void(void)> CB1;
  typedef void ( _cdecl * CB2 )( void );
 
  void setCB1( CB1 cb ) { _callback1 = cb; } ;
  void setCB2( CB2 cb ) { _callback2 = cb; } ;
 
  CB1 _callback1;
  CB2 _callback2;
};
 
class B {
public:
  void f(void) { } ;
  static void g(void) { } ;
};
 
int main(int argc, char* argv[])
{
  A a;
  B b;
 
  a.setCB1( &B::g ); // OK
  a.setCB2( &B::g ); // OK
 
  a.setCB1( boost::bind(&B::f, &b) ); // OK
  a.setCB2( boost::bind(&B::f, &b) ); // Pas OK : ne compile pas !!!
}
Quelqu'un saurait me dire s'il y a une manière de faire ?