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

SL & STL C++ Discussion :

accumlate avec une fonction membre 2


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut accumlate avec une fonction membre 2
    Bonjour j'essai d'utiliser accumulate pour faire un somme en utilisant une fonction membre comme foncteur

    Code C++ : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <vector>
    #include <algorithm>
    #include <numeric>
    #include <functional>
    class Vehicule
    {
    public:
    	virtual int GetNbRoues() =0;
       template <class T>
    	 T addtest(T &a) {return a+=GetNbRoues();};
    	};
     
    class voiture : public Vehicule
    {
    public:
     
    	virtual int GetNbRoues() {return 4;};
    };
     
    class moto : public Vehicule
    {
    public:
    	virtual int GetNbRoues() {return 2;};
    };
     
     
     
     
    template<class T1, class T2>
    T1 & addNay2 (T1 &a,T2 &b){return a+=b->GetNbRoues();};
     
     
    int main(int argc, char* argv[])
    {
    	std::vector<Vehicule*> vect;
    	vect.push_back( new voiture);
    	vect.push_back(new voiture);
    	vect.push_back(new moto);
    	vect.push_back(new moto);
    	vect.push_back(new voiture);
    	vect.push_back(new moto);
    	vect.push_back(new moto);
    	vect.push_back(new voiture);
     
    int nb =std::accumulate(vect.begin(),vect.end(),0.f, std::mem_fun(&Vehicule::addtest<int>));
     
     
    	return 0;
    }

    mais accumulate n'envoye pas les paramètres dans le bon sens,
    TY =func(Ty,pToto) au lieu de TY =func(pToto,Ty).
    existe t'il un fonction qui inverse les parametres?

    j'ai essayer de definir un mem_fun avec les parametre inversé
    Code C++ : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    template<class _Result,
    	class _Ty,
    	class _Arg>
    	class mem_fun1_tr
    		: public std::binary_function<_Arg,_Ty *, _Result>
    	{	// functor adapter (*p->*pfunc)(val), non-const *pfunc
    public:
    	explicit mem_fun1_tr(_Result (_Ty::*_Pm)(_Arg))
    		: _Pmemfun(_Pm)
    		{	// construct from pointer
    		}
     
    	_Result operator()(_Arg _Right,_Ty *_Pleft) const
    		{	// call function with operand
    		return ((_Pleft->*_Pmemfun)(_Right));
    		}
     
    private:
    	_Result (_Ty::*_Pmemfun)(_Arg);	// the member function pointer
    	};
     
     
     
    template<class _Result,
    	class _Ty,
    	class _Arg> inline
    	mem_fun1_tr<_Result, _Ty, _Arg> mem_funr(_Result (_Ty::*_Pm)(_Arg))
    	{	// return a mem_fun1_t functor adapter
    	return (mem_fun1_tr<_Result, _Ty, _Arg>(_Pm));
    	}
    ca marche mais je ne trouve pas ca propre

  2. #2
    Membre Expert

    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
    Par défaut
    Salut,

    Dans boost il y a le très pratique boost.bind qui permet de fabriquer tout un tas de foncteurs très facilement.

    En l'occurence ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nb = std::accumulate(vect.begin(),vect.end(),0, boost::bind( &Vehicule::addtest<int>, _2, _1 ) );
    En fait depuis que je connais boost.bind je n'utilise plus du tout les std::mem_fun et autres.

    MAT.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Mat007
    Salut,

    Dans boost il y a le très pratique boost.bind qui permet de fabriquer tout un tas de foncteurs très facilement.

    En l'occurence ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nb = std::accumulate(vect.begin(),vect.end(),0, boost::bind( &Vehicule::addtest<int>, _2, _1 ) );
    En fait depuis que je connais boost.bind je n'utilise plus du tout les std::mem_fun et autres.

    MAT.
    Malheureusement il faut utiliser boost. C'est pas que je n'aime pas, je connait pas. Au contraire çaà l'air génial.

    Il n'y a rien de base dans la STL?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::accumulate(machin.begin(), machin.end(), vehicule)
    Et tu définis qualque part
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vehicule operator+ (Vehicule&, const JeNeSaisQuoi& valeur)
    {
      //Faire une addition
      return newVehicule;
    }
    Attention, il faut normalement retourner un nouveau véhicule à chaque fois...
    Mais si tu additionnes des nombres de roues, tu t'y prends sans doute mal au niveau conceptuel, tu devrais simplement additionner des entiers représentant le nombre de roues et non pas des véhicules avec des nombres de roues.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Miles
    Plus simple :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    std::accumulate(machin.begin(), machin.end(), vehicule)
    Et tu définis qualque part
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vehicule operator+ (Vehicule&, const JeNeSaisQuoi& valeur)
    {
      //Faire une addition
      return newVehicule;
    }
    Attention, il faut normalement retourner un nouveau véhicule à chaque fois...
    Mais si tu additionnes des nombres de roues, tu t'y prends sans doute mal au niveau conceptuel, tu devrais simplement additionner des entiers représentant le nombre de roues et non pas des véhicules avec des nombres de roues.
    je ferai plustot le contraire
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    std::accumulate(machin.begin(), machin.end(), 0);
    avec

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int operator+ (int& valeur, const Vehicule& vec)
    {
      return valeur+vec.GetNbRoues();
    }

    mais j'aurai preferer faire un truc comme
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    std::accumulate(machin.begin(), machin.end(), 0,std::bind1st(std::plus,std::mem_fun(&Vehicule::GetNbRoues));

    mais la aussi faut faire le foncteur plus

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Effectivement, c'est mieux

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

Discussions similaires

  1. Thread avec une fonction membre d'une classe
    Par Krishna dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 14/07/2008, 23h43
  2. Réponses: 9
    Dernier message: 24/08/2007, 12h37
  3. accumlate avec une fonction membre
    Par yan dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/08/2007, 12h09
  4. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15
  5. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22

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