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 :

Type argument fonction variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut Type argument fonction variable
    Bonjour,

    Je voudrais definir une seul et même fonction acceptant le type d'un argument variable comme suit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string toto;
    double titi;
     
    my_func(toto);
    my_func(titi);
    Est-ce possible et comment?
    Merci de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Par défaut
    Bonjour,

    Les templates devraient pouvoir répondre à ce besoin, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> void my_func(T xx);
    La FAQ dédiée : http://cpp.developpez.com/faq/cpp/?page=templates

    Cordialement,
    A.

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Si tu connais les type à l'avance, une simple surcharge peut suffire non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void my_func(int i)
    {
    //...
    }
     
    void my_func(std::string s)
    {
    //..
    }
     
    std::string s = "toto";
    my_func(s);
    Le compilateur passe par une phase dite de "résolution de surcharge" dans laquelle il compare pour chaque fonction les types qu'on lui donne en argument et les types des différentes surcharges de la fonction qu'il possède. Il en déduit alors automatiquement la bonne surcharge à utiliser.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salult,
    Citation Envoyé par Arzar Voir le message
    Si tu connais les type à l'avance, une simple surcharge peut suffire non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void my_func(int i)
    {
    //...
    }
     
    void my_func(std::string s)
    {
    //..
    }
     
    std::string s = "toto";
    my_func(s);
    Le compilateur passe par une phase dite de "résolution de surcharge" dans laquelle il compare pour chaque fonction les types qu'on lui donne en argument et les types des différentes surcharges de la fonction qu'il possède. Il en déduit alors automatiquement la bonne surcharge à utiliser.
    En l'occurrence, pour la std::string l'idéal serait de passer s sous la forme d'une référence (constante ou non, selon la possibilité que peut avoir la fonction de modifier la chaine d'origine)

    Mais sinon, les deux réponses ci-dessus sont effectivement les deux solutions principales:

    Soit, tu ne sais pas précisément quel type sera transmis à ta fonction, mais tu sais parfaitement ce qu'elle doit faire, quel que soit le type, et, dans ce cas, tu entre de plein pied dans le domaine de la programmation générique (bienvenue dans le merveilleux monde des template )

    Soit tu connais précisément les différents types qui seront passés en paramètres, et tu peux appliquer "simplement" le principe de la surcharge de fonctions:

    Tout ce qu'il faut, c'est qu'au moins un argument soit de type différent par rapport à l'ensemble des autres signatures possibles, et le type de retour n'intervient pas dans la résolution de la surcharge
    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

  5. #5
    Membre éprouvé Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Par défaut
    Ok merci pour vos réponses.
    Au passage je ne sais pas ce qui ce passe mais je n'ai pas été averti par emails quelles étaient arrivées comme d'habitude!
    Cela dit, je trouve la solution template bien appropriée et élégante mais j'ai tout de même une question.
    Comment connaitre dans la focntion le type de donné envoyé en argument de maniére à pouvoir intégrer un traitement différent selon que la nature de l'argument.

    Parce que si je regarde dans la Faq, je vois bien la méthode de spécialisation, mais ca resemble furieusement à l'autre solution consistant à ecrire une fonction par type. N'y a t-il pas moyen de connaitre le type d'une variable?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Par défaut
    Dans ce cas là c'est peut être préférable d'utiliser une surcharge non?

    Comme ça tu peux effectuer les traitements voulus pour chaque type de donnée séparément.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void f(int i){
    	//...
    }
     
     
    void f(const std::string& s) {
    	//...
    }
     
     
    f(10);
    f("toto");

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Ok merci pour vos réponses.
    Au passage je ne sais pas ce qui ce passe mais je n'ai pas été averti par emails quelles étaient arrivées comme d'habitude!
    Cela dit, je trouve la solution template bien appropriée et élégante mais j'ai tout de même une question.
    Comment connaitre dans la focntion le type de donné envoyé en argument de maniére à pouvoir intégrer un traitement différent selon que la nature de l'argument.

    Parce que si je regarde dans la Faq, je vois bien la méthode de spécialisation, mais ca resemble furieusement à l'autre solution consistant à ecrire une fonction par type. N'y a t-il pas moyen de connaitre le type d'une variable?
    Salut,
    Si tu n'as pas besoin de connaître le type effectif des paramètres de la fonction, alors oui le template est la solution la plus pertinente.
    Si tu as besoin de connaître le type effectif des paramètres, alors la surcharge comme proposée par Arzar est la plus pertinente.
    Faire une fonction template en traitant des cas particulier de type est le début d'un long chemin d'incompréhension

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/10/2013, 17h59
  2. Fonction avec type de paramètre variable
    Par zentaf dans le forum C
    Réponses: 7
    Dernier message: 15/01/2013, 17h32
  3. fonction qui renvoie le type d'une variable
    Par dgwabo dans le forum C++
    Réponses: 6
    Dernier message: 31/03/2011, 16h08
  4. Réponses: 15
    Dernier message: 30/11/2007, 15h36
  5. Réponses: 9
    Dernier message: 22/07/2005, 16h10

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