boost::bind

boost::bind - C++ - Programmation

Marsh Posté le 13-03-2009 à 17:46:41    

Hi,
 
I am in trouble with bind :
 
 
l'argument _1 est utile pour indiquer qu'on se sert de x  à la place de _1 :
 

Code :
  1. bind(std::less<int>(), _1, 9)(x);


 
mais ici le _1 sert à koi ??
 

Code :
  1. std::for_each( a, a+3, bind( ref(f2), _1 ) );


 
 

Reply

Marsh Posté le 13-03-2009 à 17:46:41   

Reply

Marsh Posté le 14-03-2009 à 02:39:39    

en faite je comprends pas trop pourquoi il y a deux 'syntaxe' :
 
- bind(f, _2, _1)(x, y); // double parenthèses
- bind(f, i, _1); // simple parenthèse
 
???


Message édité par weblook$$ le 14-03-2009 à 02:39:59
Reply

Marsh Posté le 14-03-2009 à 09:17:19    

1ere ligne construction d'une fonction anonyme puis appel sur les valeurs x,y
2e ligne creation d'une fonction anonyme mais pas d'appel.
 
Trouve toi un bouquin sur le lambda calcul ca deviendra plus clair

Reply

Marsh Posté le 14-03-2009 à 11:09:39    

ok ty

Reply

Marsh Posté le 14-03-2009 à 11:38:33    

je galère méchamment pour trouver la bonne syntaxe dans le code suivant :

 
Code :
  1. template<class T> struct print : public std::unary_function<T, void>
  2. {
  3.   print(std::ostream& out) : os(out), count(0) {}
  4.   void operator() (T x) { os << x << ' '; ++count; }
  5.   std::ostream& os;
  6.   int count;
  7. };
  8. int main()
  9. {
  10.   int A[] = {1, 4, 2, 8, 5, 7};
  11.   const int N = sizeof(A) / sizeof(int);
  12.   print<int> P = std::for_each(A, A + N, print<int>(std::cout)); //c'est bindable ?
  13.   std::cout << '\n' << P.count ;
  14.  
  15. }
 

C'est possible d'utiliser bind dans ce genre de contexte? ça à un intérêt ?


Message édité par weblook$$ le 14-03-2009 à 11:39:13
Reply

Marsh Posté le 14-03-2009 à 12:12:04    

pour ce type d'astuce tu peut utiliser un ostream_iterator aussi
 
Dans ton truc c'est pas un for_each mais un fold qu'il faudrait car en general les foncteurs sont des objets immutables :/  

Reply

Marsh Posté le 14-03-2009 à 12:12:45    

Code :
  1. print<int> P = std::for_each(A, A + N, print<int>(std::cout) );


 
ça devrait marcher.
 

Code :
  1. template< typename T >
  2. void printFn( std::ostream& out, T x )
  3. {
  4.    out << x << ' ';
  5. }
  6. std::for_each(A, A + N, boost::bind( &printFn<int>, boost::ref( std::cout ), _1 );
  7. std::for_each(A, A + N, std::bind1st( std::fun_ptr( &printFn<int> ), boost::ref( std::cout ) );


 
Pas essayé, mais ça devrait marcher. Deux syntaxe, l'une avec boost::bind, l'autre avec std::bind1st.

Reply

Marsh Posté le 14-03-2009 à 12:14:27    

Joel F a écrit :

Dans ton truc c'est pas un for_each mais un fold qu'il faudrait car en general les foncteurs sont des objets immutables :/  


Ca donne quoi un fold en C++ standard ?
Je ne vois que for_each qui s'en rapproche.

Reply

Marsh Posté le 14-03-2009 à 12:27:32    

std::accumulate (http://www.sgi.com/tech/stl/accumulate.html)
ou
boost::fusion::fold (http://www.boost.org/doc/libs/1_38_0/libs/fusion/doc/html/fusion/algorithm/iteration/functions/fold.html) avec un boost::range pour encapsuler les iterateurs je pense

 

for_each c'est un map que tu truandes en fold si tu utilise une fonction stateful ce qui est assez moche.


Message édité par Joel F le 14-03-2009 à 12:29:43
Reply

Marsh Posté le 14-03-2009 à 20:16:55    

il me manque quoi, pour que mon compilo (VS2008) ne m'indique pas _1 symbole ambigu
 

Code :
  1. #include <iostream>
  2. #include <boost/lambda/lambda.hpp>
  3. #include <boost/lambda/algorithm.hpp>
  4. #include <boost/bind.hpp>
  5. #include <algorithm>
  6. #include <list>
  7. using namespace std;
  8. using namespace boost::lambda;
  9. int main()
  10. {
  11.   list<int> v(10);
  12.   for_each(v.begin(), v.end(), _1 = 1);
  13.  
  14.   cin.ignore(1,'\n');
  15. }

Reply

Marsh Posté le 14-03-2009 à 20:16:55   

Reply

Marsh Posté le 14-03-2009 à 21:40:47    

Prefixe par boost::lambda::

Reply

Marsh Posté le 14-03-2009 à 21:43:37    

Il me semble que for_each est définit dans le sous namespace ll. Et quand j'essqye de mettre boost::lambda::ll::for_each, ça ne passe pas non plus

Reply

Marsh Posté le 14-03-2009 à 21:51:55    

oula, en general on a jamais besoin de rentré dans les osu-namespace des ns boost :s

Reply

Marsh Posté le 14-03-2009 à 21:59:30    

ah ok lol, ça peut servir de le savoir

Reply

Sujets relatifs:

Leave a Replay

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