Bind, méthode et pointeur sur méthode

Bind, méthode et pointeur sur méthode - C++ - Programmation

Marsh Posté le 19-07-2017 à 15:44:00    

Bonjour,

 

J'ai un fonction que je ne peux modifier qui reçoit un objet et une méthode de
cet objet pour les appeler par la suite. Cette méthode ne reçoit qu'un argument
mais j'aimerais qu'elle en reçoive un second, sachant que ce second est fixe au
moment de l'appel de la fonction. J'ai donc pensé à bind mais je suis incapable
de trouver la bonne façon de l'utiliser.

Code :
  1. #include <iostream>
  2. #include <functional>
  3. using namespace std;
  4. //Voici la fonction que je ne peux modifier (du moins le prototype, j'ai un code
  5. //bidon à l'intérieur pour mon test.
  6. template<class T>
  7. void registerHandler(T* p_object, void (T::*p_fnc)(int))
  8. {
  9.     (*p_object.*p_fnc)(1);
  10. }
  11. //Un classe bidon elle aussi
  12. struct Plop
  13. {
  14.     Plop() {}
  15.     //Une méthode qui remplit les critères
  16.     void fonction(int i) {cerr<<i<<std::endl;}
  17.     //Un méthode avec un argument de plus
  18.     void fonction2(int i, int j) {cerr<<i<<"  "<<j<<std::endl;}
  19. };
  20. int main()
  21. {
  22.     Plop p;
  23.     //Ceci fonctionne:
  24.     registerHandler<Plop>(&p, &Plop::fonction);
  25.     //Ceci ne fonctionne pas:
  26.     using namespace std::placeholders;
  27.     registerHandler<Plop>(&p, std::bind(&Plop::fonction2, _1, _2, 4));
  28.     //Ceci non plus
  29.     registerHandler<Plop>(&p, std::bind(&Plop::fonction2, &p, _1, 4));
  30.     //Ceci non plus
  31.     registerHandler<Plop>(&p, std::bind(&Plop::fonction2, _1, 4));
  32.    
  33.     return 0;
  34. }


Quelqu'un saurait-il comment faire? Est-ce seulement possible?
Merci.


Message édité par ptitchep le 19-07-2017 à 16:49:14

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 19-07-2017 à 15:44:00   

Reply

Marsh Posté le 19-07-2017 à 20:36:35    

Bonjour,
La fonction attend un objet et un pointeur fonction membre ayant un paramètre entier. On ne peut lui passer que ce qu'elle attend.
Si la fonction attendait un 'foncteur', on pourrait lui passer un bind, un lambda ou une fonction.
Ici on pourrait créer un type 'Relai' avec une fonction membre qui appellerait la fonction2 de Plop.

Code :
  1. class Relai {
  2.    Plop* plop;
  3.    int     y;
  4. public:
  5.    Relai( Plop& plop , int y ) : plop(&plop) , y(y) {}
  6.    void fctRelai( int i ) {
  7.       plop->fonction2( i , y );
  8.    }
  9. };
  10. int main() {
  11.     Plop   plop;
  12.     Relai  relai( plop , 4 );
  13.     registerHandler( &relai , &Relai::fctRelai );

Reply

Marsh Posté le 20-07-2017 à 09:42:14    

Merci, c'est ce que j'avais fait en attendant et en désespoir de cause...


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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