En fait je voudrais que find me renvoie l'itérateur de liste_A qui corresponde à la condition testée par la fonction A::toto(const Test & t);
Malheureusement, std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t)); ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir struct call_A_toto { Test const& test; call_A_toto(Test const& t) : test(t) {} bool operator()(A& a) const { return a.toto(test); } };
puis appeler std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin qu'il marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive pas...
Je pense que Boost offre une solution permettant de construire un functeur "à la volée" (un peu comme avec std::mem_fun_ref et std::bind2nd) mais je n'ai pas eu le temps de regarder...
Falk
"Michaël Delva" wrote:
class Test { };
class A
{
bool toto(const Test & t);
};
class B
{
std::vector<A> liste_A;
void foo(const Test & t);
}
En fait je voudrais que find me renvoie l'itérateur de liste_A qui
corresponde à la condition testée par la fonction A::toto(const Test & t);
Malheureusement,
std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(),
liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t));
ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir
struct call_A_toto
{
Test const& test;
call_A_toto(Test const& t) : test(t) {}
bool operator()(A& a) const { return a.toto(test); }
};
puis appeler
std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin qu'il
marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive
pas...
Je pense que Boost offre une solution permettant de construire un functeur
"à la volée" (un peu comme avec std::mem_fun_ref et std::bind2nd) mais
je n'ai pas eu le temps de regarder...
En fait je voudrais que find me renvoie l'itérateur de liste_A qui corresponde à la condition testée par la fonction A::toto(const Test & t);
Malheureusement, std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t)); ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir struct call_A_toto { Test const& test; call_A_toto(Test const& t) : test(t) {} bool operator()(A& a) const { return a.toto(test); } };
puis appeler std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin qu'il marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive pas...
Je pense que Boost offre une solution permettant de construire un functeur "à la volée" (un peu comme avec std::mem_fun_ref et std::bind2nd) mais je n'ai pas eu le temps de regarder...
Falk
Michaël Delva
Malheureusement, std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t)); ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir struct call_A_toto { Test const& test; call_A_toto(Test const& t) : test(t) {} bool operator()(A& a) const { return a.toto(test); } };
puis appeler std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin qu'il marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive pas...
Je pense que Boost offre une solution permettant de construire un functeur "à la volée" (un peu comme avec std::mem_fun_ref et std::bind2nd) mais je n'ai pas eu le temps de regarder...
Falk
Merci de ta réponse, ça fonctionne bien comme ça ;)
Malheureusement,
std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(),
liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t));
ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir
struct call_A_toto
{
Test const& test;
call_A_toto(Test const& t) : test(t) {}
bool operator()(A& a) const { return a.toto(test); }
};
puis appeler
std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(),
liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin
qu'il marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive
pas...
Je pense que Boost offre une solution permettant de construire un
functeur "à la volée" (un peu comme avec std::mem_fun_ref et
std::bind2nd) mais je n'ai pas eu le temps de regarder...
Falk
Merci de ta réponse, ça fonctionne bien comme ça ;)
Malheureusement, std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), std::bind2nd(std::mem_fun_ref(&A::toto), t)); ne passe pas parce que toto prend le paramètre Test par référence...
La solution la plus simple me paraît de définir struct call_A_toto { Test const& test; call_A_toto(Test const& t) : test(t) {} bool operator()(A& a) const { return a.toto(test); } };
puis appeler std::vector<A>::const_iterator ite = std::find_if(liste_A.begin(), liste_A.end(), call_A_toto(t));
Si tu veux t'amuser tu peux essayer de "templatiser" call_A_toto afin qu'il marche pour n'importe quelle classe / fonction membre.
Il me semble que je dois utiliser boost pour cela, mais je n'y arrive pas...
Je pense que Boost offre une solution permettant de construire un functeur "à la volée" (un peu comme avec std::mem_fun_ref et std::bind2nd) mais je n'ai pas eu le temps de regarder...
Falk
Merci de ta réponse, ça fonctionne bien comme ça ;)