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

Langage C++ Discussion :

[C++] std::for_each et this ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut [C++] std::for_each et this ?
    Bonjour,

    J'ai une petite question de 'foncteur' j'ai à peu près compris à quoi cela pouvis bien servir et je me suis lancé dans un petit essai.

    J'ai écrit ça :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    std::for_each(this->unVecteur.begin(),this->unVecteur.end(),this);

    Et la c'est le drame, je ne suis pas vraiment dans m'esprit de la FAQ nous sommes bien d'accord, mais j'aimerais comprendre pourquoi cettr formulation est fausse.

    Dans l'esprit j'aurrai voulu fusionner this->unVecteur avec un truc genre this->unAutreVecteur cette fusion étant faite via le foncteur (enfin l'opérateur () )

    Si vous pouviez m'éclairer

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    D'après la doc de SGI :
    template <class InputIterator, class UnaryFunction>
    UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);
    Le troisième argument de for_each doit être une fonction unaire, c'est à dire une fonction à un argument. Tu ne peux pas lui passer this, qui est un pointeur !

    Edit :
    Dans l'esprit j'aurrai voulu fusionner this->unVecteur avec un truc genre this->unAutreVecteur cette fusion étant faite via le foncteur (enfin l'opérateur () )
    Je ne comprends pas trop, pourrais-tu préciser ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Je viens de (re)lire ça je n'avais pas saisi le portée de la chose :s
    Je m'étais dit que puisuqe que l'on pouvait faire ce genre de chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    struct myclass {
      void operator() (int i) {cout << " " << i;}
    } myobject;
     
    int main () {
      vector<int> myvector;
      myvector.push_back(10);
      myvector.push_back(20);
      myvector.push_back(30);
     
      cout << "\nmyvector contains:";
      for_each (myvector.begin(), myvector.end(), myobject);
     
      cout << endl;
     
      return 0;
    }

    J'aurrai pu mettre le for_each dans myobject et utiliser this pour le troisième argument (je suis aller un peu vite semble t'il :s)

    Ce n'est pas comme ça que cela amarche visiblement, je suis donc passé par une étape supplémentaire en passant en tant que 3eme argument l'opérateur () de ma classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        std::for_each(  this->unVecteur.begin(),
                        this->unVecteur.end(),
                       &MaClass::operator () );
    Dans l'idée ça me paraisait mieux, je lui passe un opérateur unaire, j'ai défini ()

    Code .hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    void operator()(int i);
    Code .cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MaClass::operator ()(int i)
    {
    this->m_count+=i;
    }


    J'ai simplifié l'exemple mais j'ai toujours un problèmle de compile que je ne comprends pas

    Code Le compilo : Sélectionner tout - Visualiser dans une fenêtre à part
    c:\program files\microsoft visual studio 8\vc\include\algorithm(29) : error C2064: le terme ne correspond pas à une fonction qui prend 1 arguments

    Alors que pour moi () prends bien un argument et un seul...

    PS: J'ai simplifié mon besoin pour avoir un truc simple et compréhensible ^^

  4. #4
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Par rapport à ton tout premier exemple, tu peux faire ça:

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    std::for_each(this->unVecteur.begin(),this->unVecteur.end(),*this);

    Ou ça:

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    std::for_each(this->unVecteur.begin(),this->unVecteur.end(),std::bind1st(std::mem_fun(&myclass::operator()), this));

    .. normalement

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Regarde ceci et cela. Cela devrait te convenir
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Citation Envoyé par metagoto Voir le message
    Par rapport à ton tout premier exemple, tu peux faire ça:

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    std::for_each(this->unVecteur.begin(),this->unVecteur.end(),*this);
    J'y ai pensé hier soir (en bas du batiment) et j'ai eu la flemme de remonter au bureau (en haut du batiment, fait chaud tout ça :p) Cette notation marche et me plait bien. J'ai pas été bien malin en remplacant l'objet de l'example par this

    Par contre j'ai lu les articles sur les algo de la stl et j'ai apri des trucs ^^
    Merci à vous.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Humm

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
     std::for_each(this->unVecteur.begin(),this->unVecteur.end(),*this);

    1 - Ca compile pas de problème, par contre ça boucle pour une raison qui méchappe :s Si j'ai 2 éléments dans le vecteur, je vois passer dans l'operateur()

    elem0 elem1 elem0 elem1 elem0 elem1 elem0 elem1 ....

    Est-ce bien normal ? Je suppose que oui, mais je ne vois pas pourquoi sa boucle comme cela...


    2 - J'ai aussi regarder du coté de mem_fun en ajoutant une fonction membre à ma classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        std::for_each(this->unVecteur.begin(),this->unVecteur.end(),     std::mem_fun(&MaClasse::MaFonction));
    (mon vecteur contien des pointeurs vers des objets, d'ou le mem_fun)

    Avec cela je retombe sur le problème suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2064: le terme ne correspond pas à une fonction qui prend 1 arguments
    Il faudrait donc que j'utilise un bind1st ou bind2nd mais je ne comprends pas :
    • - Ou sont mes deux paralmètres (je n'en vois toujours q'un :s)
      - Quel binding utiliser :s


    Lors de l'instanciation du template je me retrouve avec cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            with
    1>        [
    1>            _Fn1=std::mem_fun1_t<void,CMaclass,int *>,
    1>            _Ty=int *,
    1>            _Alloc=std::allocator<int *>,
    1>            _Result=void,
    1>            _Arg=int *,
    1>            _InIt=std::_Vector_iterator<int *,std::allocator<int *>>
    1>        ]
    Ce que j'en comprends c'est que le foncteur à une signature à 3 paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     _Fn1=std::mem_fun1_t<void,CMaclass,int *>
    Et la je dois avouer que je sèche complètement...

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/11/2012, 11h53
  2. Réponses: 5
    Dernier message: 13/07/2011, 18h56
  3. lambad expression std::for_each
    Par guillaume07 dans le forum C++
    Réponses: 2
    Dernier message: 31/01/2011, 11h26
  4. Améliorations de std::for_each avec les foncteurs
    Par Invité dans le forum Débuter
    Réponses: 15
    Dernier message: 13/05/2010, 12h46
  5. Réponses: 7
    Dernier message: 19/02/2010, 09h42

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