boost:::bind et ref

boost:::bind et ref - C++ - Programmation

Marsh Posté le 20-04-2009 à 16:47:44    

Hello,
 
dans la doc de bind il y a cet exemple :
 
 

Code :
  1. struct F2
  2. {
  3.     int s;
  4.     typedef void result_type;
  5.     void operator()( int x ) { s += x; }
  6. };
  7. F2 f2 = { 0 };
  8. int a[] = { 1, 2, 3 };
  9. std::for_each( a, a+3, bind( ref(f2), _1 ) );
  10. assert( f2.s == 6 );


 
Quel est l'intérêt d'utiliser ref ?
 
Merci.

Reply

Marsh Posté le 20-04-2009 à 16:47:44   

Reply

Marsh Posté le 20-04-2009 à 18:25:03    

essaie sans ?

Reply

Marsh Posté le 20-04-2009 à 19:42:16    

truc de ouf sans ça marche pas, ça à avoir avec une histoire de copie ?


Message édité par Glock 17Pro le 20-04-2009 à 19:43:26
Reply

Marsh Posté le 20-04-2009 à 21:38:17    

bind stocke ses valeurs bindées par valeur et les passe ensuite à la fonction/foncteur par référence, si cette dernière le supporte.
boost::ref sert à le forcer à stocker ses valeurs bindés par référence.
 
bind( f2, _1 ); // tu bind une copie de f2
bind( ref( f2 ), _1 ); // tu bind une référence vers f2

Reply

Marsh Posté le 21-04-2009 à 03:27:23    

et pourquoi ça ne marche pas sans le ref alors ici ?

Reply

Marsh Posté le 21-04-2009 à 08:47:37    

Tres certainement parce que F2::operator() n'est pas const

Reply

Marsh Posté le 21-04-2009 à 12:28:30    

c'est pas plutot l'histoire du constructeur de recopie qui est privé ?
 
 
c'est quoi le soucy en faite avec l'() qui n'est pas const, j'aimerais comprendre


Message édité par Glock 17Pro le 21-04-2009 à 19:07:31
Reply

Marsh Posté le 22-04-2009 à 03:44:31    

:sleep:

Reply

Marsh Posté le 25-04-2009 à 19:16:22    

Joel F a écrit :

Tres certainement parce que F2::operator() n'est pas const


rien à voir...
Le résultat est différent car dans un cas on accumule sur f2, dans l'autre sur une copie anonyme et temporaire de f2.
F2 est un accumulateur, son opérator() ne peut pas être const.
Sans ref, comme bind travaille sur une copie, f2 n'est pas modifié et f2.s == 0

Reply

Marsh Posté le 25-04-2009 à 19:17:26    

putain c'était easy, merci

Reply

Sujets relatifs:

Leave a Replay

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