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 :

fonctions template


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut fonctions template
    Est il possible de faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Class Toto
    {
     
    int               GetData(CString csKey);
    const char*  GetData(CString csKey)
     
    }
    car si j'essaye j'ai un truc du genre :
    d:\RATP\Borne_FROM_SCRATCH_210105\CardObj.cpp(170): error C2556: 'const CString CCardData::GetData(CString)' : overloaded function differs only by return type from 'BOOL CCardData::GetData(CString)'
    d:\RATP\Borne_FROM_SCRATCH_210105\CardObj.h(87) : see declaration of 'CCardData::GetData'

  2. #2
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Points : 54
    Points
    54
    Par défaut
    je crois qu'on peut pas surcharger en modifiant le code de retour, seulement les paramètres (tu m'as compris)

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    en effet on ne peut pas nommer de la même façon 2 méthodes qui n'ont pas le même type de retour. la surcharge est le fait d'avoir des fonctions de même nom et de même type de retour, mais dont la signature diffère.
    seuls les types des paramètres de la fonction font parti de la signature.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //surcharge fonction ex
    int ex(type1,type2);
    int ex(type3,type4,type5);
    double ex(type5);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //erreur
    type1 ex(typeA,typeB);
    type2 ex(typeA,typeB);
    EDIT: je raconte des bêtises.

    on peut avoir des types de retour différents, mais à condition d'avoir des signatures différentes, ce qui n'est pas ton cas

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    le type de retour n'est en fait pas pris en compte, on peut faire des fonctions qui retournent des choses differentes avec le meme nom mais la difference n'est faite qu'au niveau des parametres et pas des types de retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class toto {
      private:
        int arg1;
        char arg2;
      public:
        int setarg (int a) { arg1 = a; return arg1; }
        char setarg (char a) { arg2 = a; return arg2; }
        int setarg (char a) { arg2 = a; return static_cast<int>(arg2); } // invalide car meme parametres que celle du dessus
    };

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    En même temps c'est plutôt logique, si ce code compilait, comment à l'exécution quand tu vas appeller la fonction GetData le programme va-t-il savoir quelle est la fonction à utiliser ?

    Par contre si tu rajoutes un argument a une des 2 fonctions alors oui là tu peux changer le type de retour mais autant changer de nom à la fonction à ce moment là

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    et meme avec des templates du style :


    template <typename T> T function(Cstring csKey)
    {

    }

  7. #7
    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
    Avec cette fonction template, c'est un peu différent :
    Si tu appelles function(); le compilateur va te sortir qu'il ne sait pas quoi faire (que pourrait-il dire d'autre). Mais tu as le moyen de le lui spécifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function<char> ();
    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.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    si je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <class Type>
        void GetData(CString csKey, Type &c)
    {
     
    }
    comment je fais pour connaitre le type (int ou CString) à l'interieur de ma fonction

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    t'es pas obligé de rajouter un paramètre si t'as fonction est template.

    En fait tu peux pas connaitre le type qu'il y a à l'intérieur de ta fonction, le type ce sera Type et il ne sera déterminé qu'à la compilation, donc il faut utiliser des fonctions et/ou opérateurs communes aux classes que tu vas utiliser sinon t'auras des erreurs à la compilation.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Elendil_BzH
    t'es pas obligé de rajouter un paramètre si t'as fonction est template.

    En fait tu peux pas connaitre le type qu'il y a à l'intérieur de ta fonction, le type ce sera Type et il ne sera déterminé qu'à la compilation, donc il faut utiliser des fonctions et/ou opérateurs communes aux classes que tu vas utiliser sinon t'auras des erreurs à la compilation.
    Oui mais le probleme c'est que d'un coté j'ai un CString et de l'autre un WORD.

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    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
    class Truc
    {
        template< typename T > T get(const CString&);
    };
     
    template<> Truc::get<int>(const CString& str)
    {
        //le code pour le get qui retourne un int
    }
     
    template<> Truc::get<const char*>(const CString& str)
    {
        //le code pour le get qui retourne un const char *
    }
     
    int main()
    {
        CString str("toto");
        Truc truc;
     
        int i = truc.get<int>(str)
        const char* ptr = truc.get<const char*>(str);
     
    return 0;
    }
    c'est ce qu'il te faut ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par dok3
    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
    class Truc
    {
        template< typename T > T get(const CString&);
    };
     
    template<> Truc::get<int>(const CString& str)
    {
        //le code pour le get qui retourne un int
    }
     
    template<> Truc::get<const char*>(const CString& str)
    {
        //le code pour le get qui retourne un const char *
    }
     
    int main()
    {
        CString str("toto");
        Truc truc;
     
        int i = truc.get<int>(str)
        const char* ptr = truc.get<const char*>(str);
     
    return 0;
    }
    c'est ce qu'il te faut ?
    Prsque le seul probleme c'est que le type je ne peux pas le rentrer a la main car je ne le connais pas d'avance.
    le type est stockee dans une classe sous la forme :


    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
     
    class CDataIndex
    {
    public :
    	int m_nSFID;	// FileID
    	int m_nRecNo;	// RecNo
    	int m_nOffset;  // Offset
    	int	m_nSize;	// DataLen
            int m_Type      //0 = string, 1=numerique    
     
      CDataIndex()  {  }
      CDataIndex(int nSFID, int nRecNo, int nOffset, int size) {  
    	  m_nSFID = nSFID; 
    	  m_nRecNo = nRecNo;
    	  m_nOffset = nOffset;
    	  m_nSize = size;
      }
    };
    Donc parfois je veux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    m_Card.GetData("toto", csToto) //csToto est de type string
    m_Card.GetData("age", nAge) // nAge est de type WORD
    et c'est ma structure CDataIndex qui sait faire le lien entre la cle et le type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class CCardData
    {
    BLABLA
    // Associate string with  SFID, RecNo, Offset,Size and type 
    map<CString, CDataIndex> m_dataIndex;
    }

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    dans ce cas:
    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
     
    template< typename T > get(const CString&, T&);
     
    template<> get<int>(const CString& str, int& i)
    {
        //code qui met qqch dans i a partir de str
    }
     
    template<> get<const char*>(const CString& str, const char*& ptr)
    {
        //code qui met qqch dans ptr a partir de str
    }
     
    int main()
    {
        CString str("toto");
     
        const char* ptr;
        get(str,ptr);
     
        int i;
        get(str, i);
     
        return 0;
    }
    sinon regarde le tuto de meta programation de loulou

Discussions similaires

  1. fonction template et ses templates arguments
    Par epsilon68 dans le forum Langage
    Réponses: 9
    Dernier message: 10/12/2006, 22h12
  2. Fonction template recursive, avec imbrication de types
    Par YéTeeh dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 17h02
  3. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  4. Fonction template virtuelle... comment l'éviter ?
    Par :Bronsky: dans le forum Langage
    Réponses: 12
    Dernier message: 07/06/2005, 14h21
  5. Fonctions template+friend sous VC7
    Par patapetz dans le forum MFC
    Réponses: 12
    Dernier message: 24/09/2004, 11h16

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