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 :

L'état d'un Functor


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut L'état d'un Functor
    Bonjour, je suis en train d'écrire un objet fonction template qui retourne la somme d'une range

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    template <typename T>
     
    class Sum
    {private:
    	T sum;
    public:
    	Sum(){ sum = 0;};
    	void operator()( T n )
    	{
    		sum += n;
    	};
     
    	T getResult()
    	{
    		return this->sum;
    	};
     
    };
     
    int main()
    {
    	vector<int> v;
    	v.push_back( 1 );
    	v.push_back( 2 );
    	v.push_back( 3 );
    	Sum< int > sumFunc;
    	for_each( v.begin(), v.end(), sumFunc );
    	cout << sumFunc.getResult() << endl;
    	system( "pause" );
    	return 0;
    }
    Par contre, finalement le getResult retourne la valeur 0.
    Pouvez vous expliquer pourquoi et comment corriger le problème?
    Merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Les foncteurs sont passés par valeur dans la STL. Si tu dois avoir un foncteur à état utilise un utilitaire du genre boost::ref / std::ref (si t'as un compilo un peu à jour.)

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut
    Citation Envoyé par Goten Voir le message
    Les foncteurs sont passés par valeur dans la STL. Si tu dois avoir un foncteur à état utilise un utilitaire du genre boost::ref / std::ref (si t'as un compilo un peu à jour.)
    Ou bien je peux utiliser un pointeur pour la variable "sum". Bas merci bien pour ta réponse

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    template <typename T>
     
    class Sum
    {private:
    	T& sum;
    public:
    	Sum( T& state ) : sum(state) { sum = 0;};
    	void operator()( T n )
    	{
    		sum += n;
    	};
    };
     
    int main()
    {
    	vector<int> v;
    	v.push_back( 1 );
    	v.push_back( 2 );
    	v.push_back( 3 );
     
            int s;
    	Sum< int > sumFunc(s);
    	for_each( v.begin(), v.end(), sumFunc );
    	cout << s << endl;
    	return 0;
    }
    Devrait suffire

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Par défaut
    Citation Envoyé par Joel F Voir le message
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    template <typename T>
     
    class Sum
    {private:
    	T& sum;
    public:
    	Sum( T& state ) : sum(state) { sum = 0;};
    	void operator()( T n )
    	{
    		sum += n;
    	};
    };
     
    int main()
    {
    	vector<int> v;
    	v.push_back( 1 );
    	v.push_back( 2 );
    	v.push_back( 3 );
     
            int s;
    	Sum< int > sumFunc(s);
    	for_each( v.begin(), v.end(), sumFunc );
    	cout << s << endl;
    	return 0;
    }
    Devrait suffire
    Merci, c'est encore meilleur!

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Sur base de ton code initial inchangé, sauf l'appel for-each():
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    template<class T>
    class Sum_wrapper
    { 
        T *t_ptr;
    public:
        typedef T type;
    
        explicit Sum_wrapper(T & t): t_ptr(&t) {}
        operator T& () const { return *t_ptr; }
        template<typename V>
        void operator()(V const & r) const { (*t_ptr)(r); }
    };
    
    template <typename T>
    class Sum
    {private:
    	T sum;
    public:
    	Sum(){ sum = 0;};
    	void operator()( T n )
    	{
    		sum += n;
    	};
     
    	T getResult()
    	{
    		return this->sum;
    	};
     
    };
    
    int main()
    {
    	std::vector<int> v;
    	v.push_back( 1 );
    	v.push_back( 2 );
    	v.push_back( 3 );
    	Sum<int> sumFunc;
    	std::for_each( v.begin(), v.end(), Sum_wrapper< Sum<int> >(sumFunc) );
    	std::cout << sumFunc.getResult() << std::endl;
    	system( "pause" );
    	return 0;
    }
    Ou, comme le suggère goten, voir boost::reference_wrapper (boost::ref, boost::cref) dans <boost/ref.hpp>.
    On devrait aussi trouver std::reference_wrapper (std::ref, std::cref) dans <functional> avec les compilos récents.

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

Discussions similaires

  1. [CR][VB6] Impression d'un état depuis VB
    Par sda dans le forum SDK
    Réponses: 3
    Dernier message: 06/02/2007, 17h27
  2. D6 Perso et Gen d'état
    Par diam's dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 02/12/2002, 17h58
  3. Réponses: 2
    Dernier message: 17/10/2002, 16h16
  4. [CR][VB] comment générer un état ?
    Par ndi dans le forum SDK
    Réponses: 3
    Dernier message: 22/08/2002, 13h13
  5. Réponses: 5
    Dernier message: 08/07/2002, 16h22

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