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

Langage C++ Discussion :

Utilisation de template de fonctions


Sujet :

Langage C++

Vue hybride

mister3957 Utilisation de template de... 01/07/2008, 14h36
ram-0000 void GetValue(string & Val);... 01/07/2008, 14h40
mister3957 Ouais j'avais fait ça et... 01/07/2008, 14h43
Médinoc Enfin, tu peux toujours... 01/07/2008, 17h55
loufoque Je comprends pas où est le... 02/07/2008, 19h07
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Utilisation de template de fonctions
    Bonjour à tous,


    J'ai un code sous les yeux qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string GetValueStr();
    int GetValueInt();
    bool GetValueBool();
    float GetValueFloat();
    La méthode GetValueStr renvoi la valeur telle qu'elle est stockée.
    Les autres font appelle à GetValueStr et effectuent la conversion dans le type demandé.

    J'aimerai utiliser les templates pour réduire ça en une seule fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T> T GetValue();
    Mais ça ne fonctionne pas car le prototype d'une fonction ne comprend pas le type de la valeur de retour, donc le compilateur génère une erreur.

    Que puis-je faire ?


    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void GetValue(string & Val);
    void GetValue(int & Val);
    void GetValue(bool & Val);
    void GetValue(float & Val);
    C'est moins souple, c'est sûr mais ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ouais j'avais fait ça et c'est pas tip top


    Merci quand même

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Enfin, tu peux toujours templater cela:

    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
    //Je pense qu'on est obligé de passer par une fonction wrapper intermédiaire,
    //Car on ne peut spécialiser un template qu'après avoir déclaré (et défini?)
    //le template lui-même
    string GetValueStr(void);
     
    template <class T> void GetValue(T & val)
    {
    	string valueStr = GetValueStr();
    	istringstream iss(valueStr);
    	iss >> val;
    }
     
    template<> void GetValue<string>(string & val)
    {
    	return this->value;
    }
     
    string GetValueStr()
    {
    	string val;
    	GetValue(val);
    	return val;
    }
    Ce code doit répondre à tes attentes: GetValue<string> retourne la valeur nativement sans passer par rien du tout, et les autres versions y font appel...

    Et bien sûr, il y a plus simple, quand c'est GetValue<string> qui appelle GetValueStr() et non l'inverse:
    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
    string GetValueStr()
    {
    	return this->value;
    }
     
    template <class T> void GetValue(T & val)
    {
    	string valueStr = GetValueStr();
    	istringstream iss(valueStr);
    	iss >> val;
    }
     
    template<> void GetValue<string>(string & val)
    {
    	val = GetValueStr();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je comprends pas où est le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename T>
    T GetValue() const
    {
         return lexical_cast<T>(value);
    }
     
    template<>
    string GetValue<string>() const
    {
          return value;
    }
    La spécialisation doit même pas servir à grand chose...

Discussions similaires

  1. [XSLT] Utilisation variable template
    Par mihaestii dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 23/11/2005, 15h44
  2. Probleme d utilisation de template dans le cpp
    Par Math75 dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2005, 16h26
  3. Utilisation des templates
    Par mikky dans le forum C++
    Réponses: 1
    Dernier message: 14/09/2005, 12h59
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Utilisation de template dans un role de fonctions/procedures
    Par Punky65250 dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 01/09/2004, 10h05

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