Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utiliser une fonction dans std::find

2 réponses
Avatar
Michaël Delva
Bonjour à tous,

voici mon problème. J'ai les classes suivantes:

class Test { };

class A
{
bool toto(const Test & t);
};

class B
{
std::vector<A> liste_A;
void foo(const Test & t);
}


void B::foo(const Test & t)
{
std::vector<A>::const_iterator ite = std::find(liste_A.begin(),liste_A.end
(),??);
}

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

Il me semble que je dois utiliser boost pour cela, mais je n'y arrive
pas...

Merci d'avance!!

2 réponses

Avatar
Falk Tannhäuser
"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);
}

void B::foo(const Test & t)
{
std::vector<A>::const_iterator ite = std::find(liste_A.begin(),liste_A.end
(),??);
}

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

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