mem_fun / _ref

mem_fun / _ref - C++ - Programmation

Marsh Posté le 20-06-2009 à 18:53:50    

Code :
  1. struct A
  2. {
  3. void f(char c ){cout << c;}
  4. };
  5.  
  6. int  main()
  7. {
  8. string s="island";
  9. for_each( s.begin() , s.end() , std::mem_fun(& A::f ) );
  10. system("pause" );
  11. }
 

Où est le soucy ?


Message édité par Glock 17Pro le 20-06-2009 à 19:14:20
Reply

Marsh Posté le 20-06-2009 à 18:53:50   

Reply

Marsh Posté le 20-06-2009 à 19:44:13    

ce forum est mort le samedi soir, arrêter de sortir un peu!


Message édité par Glock 17Pro le 20-06-2009 à 19:44:37
Reply

Marsh Posté le 20-06-2009 à 20:37:43    

et boost::bind ca serait quand meme mieux hein :E

Reply

Marsh Posté le 20-06-2009 à 20:40:19    

De quel A faudrait il appeler le membre A::f()?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 20-06-2009 à 20:42:24    

oui en plus :/
j'ai besoin de sommeil [:prozac]

Reply

Marsh Posté le 21-06-2009 à 12:27:45    

Un Programmeur a écrit :

De quel A faudrait il appeler le membre A::f()?


Code :
  1. A h;
  2. for_each( s.begin() , s.end() , std::mem_fun (& h.f )  );


 
un truc comme ça ??

Reply

Marsh Posté le 21-06-2009 à 19:24:50    

Si je comprends bien ce que tu veux, la SL ne fournit pas (encore, ce sera en C++0X) ce qu'il faut, il te faut soit utiliser tr1 ou boost ou te faire une classe qui a ce qu'il faut (c'est pas très compliqué, mais ça sert pas à grand chose non plus de réinventer la roue).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2009 à 19:42:07    

ok je pensais que je pouvais adapter une fonction membre pour pouvoir l'utiliser dans les algorithmes de la SL , rien en standard qui prend en charge ça donc


Message édité par Glock 17Pro le 21-06-2009 à 19:49:47
Reply

Marsh Posté le 21-06-2009 à 21:00:46    

Si tu peux faire des choses.  En fait, en combinant avec bind1st, tu peux même faire ce que je crois que tu veux:
 

Code :
  1. for_each(s.begin(), s.end(),std::bind1st(std::mem_fun_ref(&A::f), h));


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-06-2009 à 21:26:13    

error C2664: 'void std::mem_fun1_ref_t<_Result,_Ty,_Arg>::operator ()(_Ty &,_Arg) const' : impossible de convertir le paramètre 1 de 'const A' en 'A &'

 

je ne vois pas trop comment résoudre le pbm du const


Message édité par Glock 17Pro le 21-06-2009 à 21:46:47
Reply

Marsh Posté le 21-06-2009 à 21:26:13   

Reply

Marsh Posté le 22-06-2009 à 08:06:07    

A::f doit être une fonction const puisque les deux arguments des binary_function sont passés par référence constante.  Autre chose qui pourrait te surprendre, bind1st copie ses arguments.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 22-06-2009 à 11:17:04    

Un Programmeur a écrit :

A::f doit être une fonction const puisque les deux arguments des binary_function sont passés par référence constante.  Autre chose qui pourrait te surprendre, bind1st copie ses arguments.


super ça marche bien, et si f avait deux arguments, on peut s'en sortir aussi? il faut combiner deux bind?

Reply

Marsh Posté le 22-06-2009 à 12:13:26    

Ça fait partie des choses pas encore possible.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 22-06-2009 à 12:22:22    

boost::function le supporte par contre de mémoire

Reply

Marsh Posté le 22-06-2009 à 12:28:23    

De même que TR1 (et il y a moyen d'avoir des arguments non const si ma mémoire est fidèle).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Sujets relatifs:

Leave a Replay

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