IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fonction "prédicat" dans une fonction ?


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut Fonction "prédicat" dans une fonction ?
    Bonjour a tous,

    J'ai besoin d'utiliser un prédicat pour fixer la valeur d'un element dans une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void				
    TGrid::Set_Anchor_Squares_Not_Played( void )
    {
    	std::for_each(	m_po_configuration->Get_Anchor_Squares().begin(), 
    			      m_po_configuration->Get_Anchor_Squares().end(),
    			      Set_Not_Played ) ;
    }
    Le prédicat en question est Set_Not_Played.

    Pour le moment, ce prédicat est une fonction propre à ma classe (TGrid) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void 
    TGrid::Set_Not_Played( TAnchorSquare* par_po_anchor_square )
    {
    	par_po_anchor_square->Set_Played( false ) ;
    }
    Mais pour des questions d'esthétique (ou juste pour savoir) je voudrais contraindre la portée de cette fonction, non pas à ma classe, mais seulement à ma fonction TGrid::Set_Anchor_Squares_Not_Played. Or, quand je mets ma fonction prédicat dans cette fonction, ca ne compile pas.
    Comment faudrait-il que je fasse ?
    En fait, je voudrais un peu le meme fonctionnement qu'un foncteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FONCTION()
    {
         struct foncteur
         {
             operator()()
             {
     
             }
         }
     
         std::generate( x.begin(), x.end(), foncteur() );
    }
    Merci pour votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    D'ailleurs en fait j'avais pas vu mais ca ne marche pas du tout mon truc !

    std::for_each( m_po_configuration->Get_Anchor_Squares().begin(),
    m_po_configuration->Get_Anchor_Squares().end(),
    Set_Not_Played ) ;

    Me donne
    error C3867: &'TGrid::Set_Not_Played' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'TGrid::Set_Not_Played' pour créer un pointeur vers membre

    et TGrid::Set_Not_Played idem.

    Si vous avez un indice svp avant de répondre a ma précédente question ? merci !

    Alex

  3. #3
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Si ta fonction TGrid::Set_Not_Played était static, tu aurais pu faire ton for_each.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Et il n'y aurait pas moyen d'ajouter un "mem_fun" pour oublier le fait qu'elle doive etre statique ? Genre std::mem_fun(&TGrid::Set_Not_Played) ?

    Merci

  5. #5
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Si, associé avec un std::bind1st dans le cas présent.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Mieux vaut utiliser boost::bind.

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    C'est sûr... Mais des fois ça repose de montrer à quelqu'un ce qui se trouve dans la bibliothèque standard plutôt que de lui demander en plus de télécharger boost...

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    C'est clair, merci Hanlee !
    En effet je ne veux utiliser que la lib standard ! Tant pis pour boost !

    Par contre je ne comprends pas comment utiliser bind1st avec mon std::mem_fun(&TGrid::Set_Not_Played). Pouvez-vous m'éclairer ?

    Merci.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ben la dernière fois que j'avais testé, ça marchait pas.
    De toutes façons dans ton cas c'est pas ça qu'il faut, il faut juste rendre ta fonction membre statique.

  10. #10
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    std::mem_fun dans le cas présent crée un foncteur à partir d'un pointeur de fonction membre.

    Ton pointeur de fonction membre a en fait 2 variables, avec le pointeur this.

    Or, for_each n'accepte que des fonctions/foncteurs à 1 variable, c'est pourquoi il faut que tu fasses une curryfication du résultat de std::mem_fun, c'est à dire en faisant une application partielle de fonction (tu crées un nouveau foncteur en fixant le premier paramètre avec le pointeur this par conséquent).

    On fixe le premier paramètre à l'aide std::bind1st.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TGrid objet_tgrid;
     
    std::for_each(m_po_configuration->Get_Anchor_Squares().begin(),
                  m_po_configuration->Get_Anchor_Squares().end(),
                  std::bind1st(std::mem_fun(&TGrid::Set_Not_Played), &objet_tgrid)
    );
    -----

    Et pourquoi tu ne la mets pas static ta fonction ?
    Tu n'utilises même pas d'attributs membres.

  11. #11
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci bcp pour vos réponses !

    Hanlee ton m'explication m'a beaucoup aidé. Effectivement je vais utiliser une fonction statique mais j'essaierai ta solution avec le bind_first au moins pour la culture. Je trouve ça assez compliqué mais en intégrant bien le concept ça a le mérite d'être connu !

    Merci les pros du C++ de m'avoir éclairé là dessus !

    A la prochaine !

    Alex.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  2. une fonction pour le bgcolor dans une datatable
    Par ghnawfal dans le forum JSF
    Réponses: 2
    Dernier message: 09/04/2008, 13h33
  3. Déclarer une fonction ayant 2 prototypes dans une DLL
    Par Jayceblaster dans le forum Delphi
    Réponses: 8
    Dernier message: 17/02/2007, 12h00
  4. fonction récupérant des valeurs dans une fonction popup...
    Par petitsims dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/01/2005, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo