Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1553 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  boost::bind

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

boost::bind

n°1861308
weblook$$
Posté le 13-03-2009 à 17:46:41  profilanswer
 

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 ) );


 
 

mood
Publicité
Posté le 13-03-2009 à 17:46:41  profilanswer
 

n°1861424
weblook$$
Posté le 14-03-2009 à 02:39:39  profilanswer
 

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
n°1861434
Joel F
Real men use unique_ptr
Posté le 14-03-2009 à 09:17:19  profilanswer
 

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

n°1861455
weblook$$
Posté le 14-03-2009 à 11:09:39  profilanswer
 

ok ty

n°1861457
weblook$$
Posté le 14-03-2009 à 11:38:33  profilanswer
 

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
n°1861461
Joel F
Real men use unique_ptr
Posté le 14-03-2009 à 12:12:04  profilanswer
 

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 :/  

n°1861462
jesus_chri​st
votre nouveau dieu
Posté le 14-03-2009 à 12:12:45  profilanswer
 

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.

n°1861463
jesus_chri​st
votre nouveau dieu
Posté le 14-03-2009 à 12:14:27  profilanswer
 

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.

n°1861467
Joel F
Real men use unique_ptr
Posté le 14-03-2009 à 12:27:32  profilanswer
 

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
n°1861585
weblook$$
Posté le 14-03-2009 à 20:16:55  profilanswer
 

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. }

mood
Publicité
Posté le 14-03-2009 à 20:16:55  profilanswer
 

n°1861617
Joel F
Real men use unique_ptr
Posté le 14-03-2009 à 21:40:47  profilanswer
 

Prefixe par boost::lambda::

n°1861620
weblook$$
Posté le 14-03-2009 à 21:43:37  profilanswer
 

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

n°1861625
Joel F
Real men use unique_ptr
Posté le 14-03-2009 à 21:51:55  profilanswer
 

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

n°1861627
weblook$$
Posté le 14-03-2009 à 21:59:30  profilanswer
 

ah ok lol, ça peut servir de le savoir


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  boost::bind

 

Sujets relatifs
tree stl boost ??pointeurs intelligents Boost
Tests unitaires & GTK, quelle librairie de test ? (boost, gunit ...)[résolu] Boost + convention d'appel __stdcall ?
Problème Boost & STLPort sous Mingw (sous wxDev-C++)[RESOLU] Pb LINK lib Boost wpath (et wstring) - UNICODE ?
Port série tout ça : LA solution propre via BOOST::ASIOBoost::Tokenizer : accès direct aux tokens [RESOLU]
boost mpl, passer une fonction dans un placeholderboost::bind, pourquoi this ne marche pas?
Plus de sujets relatifs à : boost::bind


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR