Membre non static en pointeur sur fonction pour callback

Membre non static en pointeur sur fonction pour callback - C++ - Programmation

Marsh Posté le 29-03-2020 à 21:03:57    

Hello à tous,
J'ai un soucis sur lequel je bute et je n'arrive pas à trouver de solution malgré mes recherches.

 

J'ai une bibliothèque en C (je n'ai pas le code) qui me demande à un moment un pointeur sur fonction.
J’écris en C++ et je souhaite passer un membre de mon objet.
Je souhaite ne pas ecrire une fonction static qui prendrait "this" en paramètre pour rappeler mon membre qui devrait être public.

 

J'essai de m'en sortir avec "std::bind" ou les lambda, sans succès.

 

Si dessous mon test case :

 
Code :
  1. #include <stdio.h>
  2. #include <functional>
  3. class A
  4. {
  5. private:
  6.     int (*pfn)(int) = nullptr; // CANNOT CHANGE THAT
  7.    
  8. public:
  9.     int foo(int i) { printf("arg : %d\n", i); return 42; }
  10.    
  11.     void callfoo() {
  12.         pfn = std::bind(&A::foo, this, std::placeholders::_1); // DOES NOT COMPILE
  13.         pfn = [&](int a) { return foo(a); }; // DOES NOT COMPILE
  14.         int ret = pfn(69);
  15.         printf("ret : %d\n", ret);
  16.     }
  17.    
  18. };
  19. int main()
  20. {
  21.     A a;
  22.     a.callfoo();
  23.    
  24.     return 0;
  25. }
 


Y'a t'il un moyen de s'en sortir ?


Message édité par azubal le 29-03-2020 à 21:06:13
Reply

Marsh Posté le 29-03-2020 à 21:03:57   

Reply

Marsh Posté le 07-05-2020 à 09:48:13    

Tu as deux choix :  

  • Soit tu exposes ta fonction avec friend.  
  • Soit tu la sorts de la classe et dans ce cas elle devient global comme le pointeur de fonction de ta lib C.


Code :
  1. #include <stdio.h>
  2. #include <functional>
  3. class A
  4. {
  5. private:
  6.     int (*pfn)(int) = nullptr; // CANNOT CHANGE THAT
  7.  
  8. public:
  9.     friend int foo(int i) { printf("arg : %d\n", i); return 42; } // expose ta function avec friend
  10.  
  11.     void callfoo() {
  12.         pfn = &foo; // maintenant tu peux envoyer l'adresse de ta function.
  13.         int ret = pfn(69);
  14.         printf("ret : %d\n", ret);
  15.     }
  16.  
  17. };
  18. int main()
  19. {
  20.     A a;
  21.     a.callfoo();
  22.  
  23.     return 0;
  24. }


 
 Voila vite fait bien fait :o


---------------
Praise Kek
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed