Utilisation de bind2nd et bind1st
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 :
Code:
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());
} |
J'ai donc tenté de la ré-écrire la boucle de calcul avec le module <fonctionnal.h> comme ceci :
Code:
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)
)
); |
Je ne cherche pas l'éfficacité en ligne de code mais juste à bien comprendre le fonctionnement de la stl sur ce module.
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.