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 :

2 méthodes = 1 méthode, comment ?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut 2 méthodes = 1 méthode, comment ?
    Bonjour,

    J'ai deux méthodes très semblable :

    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
    	void replicateFrom(const std::list<T>& l) {
    		reinit(l.size());
     
    		int i = 0 ;
    		for(typename std::list<T>::iterator it=l.begin(); it!=l.end();
    			 ++it, ++i)
    			data[i] = *it ;
    	}
     
    	void replicateFrom(const std::vector<T>& v) {
    		reinit(v.size());
     
    		int i = 0 ;
    		for(typename std::vector<T>::iterator it=v.begin(); it!=v.end(); ++it, ++i)
    			data[i] = *it ;
    	}
    Je me demandais s'il y avait une solution pour en faire qu'une seule. Quelqu'un aurait-il une idée à me suggérer ?

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    tu n'as qu'à passer les itérateurs et la taille en paramètre d'une fonction template qui fera le travail :
    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
     
    template <typename ItType>
    void replicateFrom( ItType itBegin, ItType itEnd, size_t uiSize)
    {
    	reinit( uiSize);
     
    	int i = 0 ;
    	for(ItType it = itBegin ; it != itEnd ; ++it, ++i)
    	{
    		data[i] = * it;
    	}
    }
    //utilisation :
    replicateFrom<std::vector<T>::const_iterator>( myVector.begin(), myVector.end(), myVector.size());
    replicateFrom<std::list<T>::const_iterator>( myList.begin(), myList.end(), myList.size());
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    merci. Je pense que je vais garder ma première solution qui me demande moins de code lors de l'appel aux méthodes.

  4. #4
    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
    Bonjour,
    L'idée proposée par dragonjoker59 - passer un couple d'itérateur - est bonne. Par contre il n'utilise pas le fait que les arguments template d'une fonction peuvent être déduits lors de l'appel de la fonction. On peut écrire plus simplement :

    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
    template <typename ItType>
    void replicateFrom( ItType itBegin, ItType itEnd)
    {
       int uiSize = std::distance(itBegin, itEnd);
       reinit( uiSize);
     
       int i = 0 ;
       for(ItType it = itBegin ; it != itEnd ; ++it, ++i)
       {
          data[i] = * it;
       }
    }
     
    int main()
    {
       std::vector<int> myVector;
       std::list<int> myList;
       replicateFrom( myVector.begin(), myVector.end());
       replicateFrom( myList.begin(), myList.end());
    }

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Sinon, j'ai une fonction de ma lib perso dont tu pourrais t'inspirer:
    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
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    template <typename Container>
    void PrintContainer( ostream & ostr, const Container & container )
    {
    	for ( Container::const_iterator it = container.begin(); it != container.end(); ++it )
    		ostr << (*it) << " ";
    	ostr << endl;
    }
     
    int main()
    {
    	vector< int > v_int;
    	v_int.push_back( 3 );
    	v_int.push_back( 6 );
    	vector< float > v_float;
    	v_float.push_back( 3.5f );
    	v_float.push_back( 6.6f );
     
    	PrintContainer( cout, v_int );
    	PrintContainer( cout, v_float );
     
    	cin.get();
    	return 0;
    }
    output:
    3 6
    3.5 6.6
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    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
     
    int data[TAILLE_DATA];
    std::vector<int> myVector(TAILLE_DATA);
    std::list<int> myList(TAILLE_DATA);
     
    // Remplissage de myVector et myList
    (...)
     
    // Recopie de l'ensemble de myVector vers data
    std::copy(myVector.begin(), myVector.end(), data);
     
    // Recopie de l'ensemble de myList vers data
    std::copy(myList.begin(), myList.end(), data);
    Je crois que ça pourrait répondre plus largement à ton problème...

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

Discussions similaires

  1. [V8] Méthode ORM create, comment l'utiliser avec la V8 ?
    Par ammine007 dans le forum Odoo (ex-OpenERP)
    Réponses: 0
    Dernier message: 04/12/2014, 09h31
  2. Réponses: 11
    Dernier message: 23/12/2011, 18h02
  3. Réponses: 3
    Dernier message: 29/07/2009, 21h18
  4. méthodes de méthode
    Par airod dans le forum Général Python
    Réponses: 7
    Dernier message: 27/09/2007, 13h30
  5. Forme d'appel de méthode réservé méthodes de classe
    Par Chicobrasil dans le forum Langage
    Réponses: 16
    Dernier message: 03/01/2006, 17h43

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