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 :

nombre des paramètres d'une fonction


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut nombre des paramètres d'une fonction
    Salut,

    Est il possible en C++ d'implémenter une fonction ou le nombre de ses paramètres dépend d'un nombre donné par l'utilisateur?
    par exemple, si on donne un nombre égale à deux la fonction dépendra ainsi de deux paramètres, si on donne 3 elle dépendra de 3 paramètres...

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    Ma réponse ne va pas forcément te plaire:
    "Ca dépend".
    Dans l'absolu non, mais on peut certainement se débrouiller autrement.
    Quel est ton objectif?

    On peut imaginer d'avoir plusieurs ensemble de fonctions, et d'utiliser les bonnes.
    On a aussi la fonction à arguments variable (avec le ...), comme le printf.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par kochfet Voir le message
    Est il possible en C++ d'implémenter une fonction ou le nombre de ses paramètres dépend d'un nombre donné par l'utilisateur?
    par exemple, si on donne un nombre égale à deux la fonction dépendra ainsi de deux paramètres, si on donne 3 elle dépendra de 3 paramètres...
    C'est ce que fait la fonction main().

  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Cela peut dépendre des paramètre et ce qu'on en fait.

    Première méthode serait la surcharge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Foo( const int p_1 ) {
        ....
    }
    void Foo( const int p_1, const int p_2 ) {
        ....
    }
    ...
    //Ou bien
    void Foo( const int p_1, const int p_2 = 0 ) {
        ....
    }
    Sinon il serait possible d'avoir un tableau en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Foo( const std::vector& liste_de_parametre ) {
    ...
    }

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par oodini Voir le message
    C'est ce que fait la fonction main().
    Ah bon ? Main possède plusieurs surcharges, mais n'accepte pas un nombre variable d'arguments...

    Pour répondre au post initial, si les données sont toutes de même type, il est souvent préférable d'avoir une fonction à 1 paramètre de type conteneur (on lui passe par exemple un vector<T>n ou en C++11 un initializer_list<T>).

    Si les types divergent, il y a alors les fonctions variadiques (qui posent plein de problèmes, en particulier, elles ne marchent pas avec les types trop évolués), ou bien, avec un compilateur qui les gère, les fonctions template variadiques (qui demandent une maîtrise minimale de la metaprogrammation template pour être utilisées).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Ah bon ? Main possède plusieurs surcharges, mais n'accepte pas un nombre variable d'arguments...
    Exact. Mea culpa.
    cela fait trop longtemps que je n'ai pas eu affaire à un main.

  7. #7
    Membre du Club
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Points : 51
    Points
    51
    Par défaut
    Je pense que je veux essayer d'utiliser les fonctions variadique.

    Si les types divergent, il y a alors les fonctions variadiques (qui posent plein de problèmes, en particulier, elles ne marchent pas avec les types trop évolués)
    Est il possible de m'expliquer un peu comment?

  8. #8
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Quel est le problème rencontré ?

    N'y a t-il pas moyen de le contourner ?

    Et avoir une fonction pour chaque paramètre ?

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    A vrai dire, j'ai envie de dire : pour quoi faire

    A priori, une fonction ne doit demander comme argument que les informations qu'elle n'est pas en mesure de récupérer "par elle-même", mais une fonction est aussi sensée avoir un comportement clairement défini

    A partir de là, on peut estimer que
    1- soit la fonction va traiter des information "par lot", et donc, l'idéal est sans doute de transmettre une collection d'informations de type similaires (par exemple : std::vector<UnTypeQuelconque>),

    2- soit "il est possible" d'avoir une série d'argument pour lesquels on peut déterminer des valeurs par défaut

    3- on peut estimer que le nombre d'information sera fixe (un, deux ou N arugment) mais que leur type sera différent: on pourra alors envisager la surcharge de fonction

    4- La fonction (prenant plusieurs informations) ne correspond en réalité qu'à l'appel de différentes surcharges pour un type particulier (c'est souvent utilisé en OO, en faisant en sorte que la fonction renvoie une référence sur l'objet courent )
    Citation Envoyé par kochfet Voir le message
    Je pense que je veux essayer d'utiliser les fonctions variadique.
    Si tu est dans une situation proche du 4, et que tu peux utiliser les possibilités offertes par C++11, je te conseillerais bien de t'orienter vers les template variadic.
    Tu pourrais parfaitement avoir une fonction surchargée proche de
    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 <iostream>
    #include <string>
    #include <ctime>
    void foo(int i){
        std::cout<<"using an int as "<<i<<std::endl;
    }
    void foo(std::string const & i){
        std::cout<<"using a string as "<<i<<std::endl;
    }
    void foo(tm const & i){
        const char * temp=asctime(&i);
        std::cout<<"using a time as"<< temp<<std::endl;
    }
     
    template <typename T, typename... Others>
    void foo(T data, Others... rest){
        foo(data);
        foo(rest...);
     
    }
    int main(){
     
      time_t rawtime;
      struct tm * timeinfo;
      time ( &rawtime );
      timeinfo = localtime ( &rawtime );
      std::string hello("hello");
      std::string world("world");
      int i=0,j=2,k=3,l=4;
    foo(hello,i,*timeinfo,j,world,k,l);
    return 0;
    }
    Mais, si tu travailles en C++, peut etre préféreras tu quelque chose comme
    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
    44
    45
    46
    47
    #include <iostream>
    #include <string>
    #include <ctime>
    #include <sstream>
    class MaClass{
    public:
        MaClass& foo(int i){
            std::stringstream ss;
            ss<<str<<" "<<i;
            str=ss.str();
            return *this;
        }
        MaClass & foo(std::string const & i){
            str.append(" ")
               .append(i);
            return *this;
        }
        MaClass & foo(tm * t){
            str.append(" ")
               .append(asctime(t));
            return *this;
        }
        std::string const &  theString() const{return str;}
    private:
        std::string str;
     
    };
    int main(){
     
      time_t rawtime;
      struct tm * timeinfo;
      time ( &rawtime );
      timeinfo = localtime ( &rawtime );
      std::string hello("hello");
      std::string world("world");
      int i=0,j=2,k=3,l=4;
      MaClass obj;
      obj.foo(i)
         .foo(hello)
         .foo(j)
         .foo(world)
         .foo(k)
         .foo(timeinfo)
         .foo(l);
    std::cout<<obj.theString()<<std::endl;
    return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/11/2008, 10h55
  2. Réponses: 2
    Dernier message: 28/04/2008, 20h04
  3. Réponses: 3
    Dernier message: 16/05/2007, 10h03
  4. Réponses: 3
    Dernier message: 14/05/2007, 15h24
  5. Evaluations des paramètres d'une fonction
    Par WebPac dans le forum Langage
    Réponses: 15
    Dernier message: 06/10/2005, 09h46

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