Bonjour,
après avoir parcourus la Faq et étudié l'utilisation de bind2nd et bind1st qui y est décrite ainsi que mon Stroustrup, j'ai essayer de bien cerner le fonctionnement de ces deux outils.
Je bloque sur ce qui me semble être un cas d'école :
J'essaye de ré-écrire une fonction simple et qui me satisfait déjà mais à l'aide des opérateurs de <functionnal.h>
Voici ma fonction :
Elle est membre de la classe "messages" qui hérite de std::list<coMsg*>
"nombre" est un typedef de nombre à virgule, et "uint" un typedef d'entier strictement positif. "sens" est un "uint". La fonction intervient dans le calcul d'une probabiltée sans interet ici :
J'ai donc tenté de la ré-écrire la boucle de calcul avec le module <fonctionnal.h> comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 nombre CalculPi(sens categorie) { uint compteur = 0; for(messages::iterator i = begin(); i != end(); i++) if ((*i)->GetCat() == categorie) compteur++; if (size() == 0) return 0.; return ((nombre)compteur / (nombre)size()); }
Je ne cherche pas l'éfficacité en ligne de code mais juste à bien comprendre le fonctionnement de la stl sur ce module.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ptrdiff_t c = std::count_if(begin(),end(), std::bind2nd( std::bind1st(std::equal_to<sens>(), categorie ), std::mem_fun(&coMsg::GetCat) ) );
Le problème... c'est que ca ne marche pas du tout, malgré les messages d'erreurs du compilateur je ne parviens pas à trouver comment disposer les fonctions pour re-créer l'équivalent de ma boucle si dessus.
Ce qui fonctionnellement s'écrirais comme ceci en ocaml :
" fold_left (fun r x -> if categorie = CoMsg.getCat x then r else succ r) 0 "
comment je peu l'écrire en C++ avec les fonctions du module <fonctionnal.h>
Est ce que vous pourriez m'aider à trouver comment disposer les fonctions pour recréer correctement ma petite boucle ?
Merci d'avance pour votre aide.
Partager