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 :

comment utiliser les foncteurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut comment utiliser les foncteurs
    bonjour!!

    j ai vu ds la faq a quoi servent les foncteurs

    mais je ne vois pas comment les utiliser??

    je voudrais ecrire moi meme une fonction qui recoit un foncteur et une list et qui m affiche tt les objets de ma liste qui corespondent au criteres du foncteurs??

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Un foncteur est un objet pouvant avoir n'importe quel type (puisqu'en général une classe = un foncteur), donc niveau déclaration ça donnera ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename F>
    void Fonction(F Foncteur);
    Ensuite, un foncteur étant un objet agissant de la même manière qu'une fonction, il suffit de faire un appel à celui-ci avec l'opérateur () :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename F>
    void Fonction(F Foncteur)
    {
        Foncteur(/* paramètres /*);
    }

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    la faq:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      // Tri selon leur numéro 
       std::sort(v.begin(), v.end(), SortByNumber());
    puisque SortByNumber est un struct, il ne doit pas etre instance pour etre utiliser??

    comment se passage fonctionne?
    je ne comprends pas trop!!

    peut on definir ns meme des pointeurs vers fonctions??

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    peux tu stp completer ton exemple, je n ai pas saisi!!

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, on passe bien une instance.

    Ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(v.begin(), v.end(), SortByNumber());
    Est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SortByNumber Fonc;
    std::sort(v.begin(), v.end(), Fonc);
    Sauf que c'est plus court et certainement plus optimisé.

    peut on definir ns meme des pointeurs vers fonctions??
    Oui, ça marchera tout aussi bien. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool Compare(int i1, int i2)
    {
        ...
    }
     
    std::sort(v.begin(), v.end(), &Compare);
    Mais là encore, ce sera moins flexible et moins optimisé.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    comment appelle t on l adresse de la fonction??

    comment ecrire une fonction qui recoit une adresse de fonction??

    sort(int,int, ???? );

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    Citation Envoyé par Loulou24
    Ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(v.begin(), v.end(), SortByNumber());
    Est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SortByNumber Fonc;
    std::sort(v.begin(), v.end(), Fonc);
    .
    je ne comprends pas pkoi c la meme chose!!

    en fait, c est la meme chose qui me derange depuis le debut, ques qui se passe dans cette fonction sort()??

    si je lui envoi un objet du struct elle devra appeler
    Foct.la_fonction_bool();

    alors que si j envois directement l adresse de la fonction ca l appelle directement!!

    jme suis fais comprendre ou tu ne vois pas mon probleme??

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 180
    Par défaut
    desole, j avais pas saisi que la fonction c etait un operator()!!

    mais peux tu stp quand meme m expliquer comment


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(v.begin(), v.end(), SortByNumber());
    est equivalent a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SortByNumber Fonc; 
    std::sort(v.begin(), v.end(), Fonc);

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    SortByNumber() déclare un objet temporaire non nommé de type SortByNumber. Donc c'est comme si tu le déclarais avant l'appel, sauf que là il est créé et détruit sur la même ligne de code.

    A part ça, tu ne peux vraiment pas faire d'effort pour écrire correctement ?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Une précision qui me semble utile :
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(v.begin(), v.end(), SortByNumber());
    Les parenthèses de SortByNumber() font appel au constructeur et non à la méthode operator().

  11. #11
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Voila,

    Le fait d'avoir () après SortByNumber est là ou se produit l'instanciation. Les parenthèses font appel au constructeur et cela instancie ton objet. À noter qu'il se détruit automatiquement après son utilisation. Donc, comme l'a dit Loulou24, il s'agit d'un objet temporaire.

    Parcontre avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SortByNumber Fonc;
    std::sort(v.begin(), v.end(), Fonc);
    Ton objet n'est pas détruit après l'utilisation.

Discussions similaires

  1. [HTTP] Comment utiliser les POST par programation
    Par Popof dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 31/01/2005, 09h14
  2. Réponses: 4
    Dernier message: 13/12/2004, 20h37
  3. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

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