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 :

pointeur de fonction membre


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut pointeur de fonction membre
    Bonjour à tous,

    J'ai le problème suivant: j'ai une classe A qui possède une méthode qui prend en paramètre des B en const référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct B;
     
    struct A
    {
      void method(B const& elt);
    };
    J'ai maintenant un vecteur de B* et je voudrais appliquer la méthode de A sur chacun de ces éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::vector<B const*> lst;
    A a;
    std::for_each(lst.begin(), lst.end(), std::bind1st(std::mem_fun(&A::method), &a));
    Mon problème c'est que la méthode de A attend des const références et dans mon code décrit ci-dessus, je lui passe des adresses constantes ce qui n'est pas compatible... Auriez-vous une idée pour contourner ce problème??
    PS: si possible sans utiliser boost

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu tiens à utiliser un std::for_each ?

    Parce que sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(std::vector<B const*>::iterator it = lst.begin(), it != lst.end(); ++it)
        a.method(**it);

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2005
    Messages
    3 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : juin 2005
    Messages : 3 522
    Points : 6 683
    Points
    6 683
    Par défaut
    et même tant qu'a faire un const_iterator plutôt qu'un iterator
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    ben en fait l'objectif était plus d'utiliser for_each pour justement remplacer une boucle for. Si vous avez une solution utilisant boost ça m'intéresse également (au final c'est plus une question d'ordre culture générale)

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    J'ai une solution avec des lambdas, si tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::for_each(lst.begin(), lst.end(), [&a](B const * b) { a.method(*b); });

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : juin 2006
    Messages : 1 294
    Points : 1 516
    Points
    1 516
    Par défaut
    Salut,

    Avec Boost.Lambda :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <boost/lambda/bind.hpp>
     
        std::for_each(lst.begin(), lst.end(), boost::lambda::bind(&A::method, &a, *boost::lambda::_1));
    MAT.

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Mettez vous à Boost.Phoenix, c'est l'avenir

  8. #8
    Membre émérite

    Inscrit en
    mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par CedricMocquillon Voir le message
    Si vous avez une solution utilisant boost ça m'intéresse également (au final c'est plus une question d'ordre culture générale)
    Personne ne l'a encore évoqué, donc je m'y colle : BOOST_FOREACH.
    La solution la plus élégante, AMHA, et de loin, en attendant le foreach natif du C++0x :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<B const*> lst;
    A a;
     
    BOOST_FOREACH(B const* bptr, lst)
    {
       a.method(*bptr);
    }

Discussions similaires

  1. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  2. Pointeur de fonction membre.
    Par fabone dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2006, 13h18
  3. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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