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 :

Parlons des templates


Sujet :

C++

  1. #1
    Membre actif Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 217
    Points
    217
    Par défaut Parlons des templates
    Bonjour, j'etudie c++ depuis un certain temps, et les template est la partie qui m'est la plus floue.
    L'utilite prend sont sens certainement pour implementer des class pour manipuler des collections d'objets, genre Vector, Map, ou encore des smart pointer, mais je me demande quelle utilite cela peut avoir dans des contextes plus precis, comme l'appel d'une methode d'un type generique genre:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class T*> void uneAction()
    {
          T->MethodeDuTypeInconnu();
    }

    Le type etant generique, j'immagine qu'il n'est pas possible d'appeler aucune methode ou alors il faudrait rendre le template utilisable pour une famille d'objet specifique pour appeller une methode commune a la famille, mais pour cela on a deja les pointeurs de classes de base virtuelles qui permetent le polymorphisme. En outre j'ai lu quelques articles sur la metaprogrammation avec les templates, et si j'ai bien compris, ca sert a combiner generiquement des comportement commun entre des objet different (rien qu'a me lire je sens que je recrache ce que j'ai ingurgite tout en restant sceptique)
    Donc je ne suis pas certain d'avoir compris, en fait je dirais meme que je suis certain de ne pas avoir compris, mais le seul interet des fonctions template que j'ai compris, se resume a manipuler des collections.
    Voila, merci de me faire partager vos savoirs

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il y a beaucoup d'intérêts aux templates. Par exemple, on peut implémenter le pattern stratégie par des templates. C'est sans doute l'application la plus courante que je fais des templates, à part permettre de choisir un type de données pour stocker mes données - float, double, ... -
    Quand j'utilise un concept, je sais quels sont les types de données et les fonctions disponibles dans une classe. Oui, on pourrait faire la même chose avec du polymorphisme d'héritage, mais on utiliserait alors un pointeur Ici, on peut utiliser le même principe que le polymorphisme tout en utilisant des objets directement. Naturellement, on ne peut pas faire tout ce que l'héritage permet, mais l'héritage ne permet pas non plus de tout faire

  3. #3
    Membre actif Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par Miles
    Il y a beaucoup d'intérêts aux templates. Par exemple, on peut implémenter le pattern stratégie par des templates. C'est sans doute l'application la plus courante que je fais des templates, à part permettre de choisir un type de données pour stocker mes données - float, double, ... -
    Quand j'utilise un concept, je sais quels sont les types de données et les fonctions disponibles dans une classe.
    Je suis pas certain de comprendre, mais tu veux donc dire que les templates peuvent s'appliquer a une famille d'objet ayant des methodes communes, mais je pensais que ca pourrait poser un prob en terme se "securite du code". donc le moyen de garder le code fiable serait alors de systematiquement encapsuler les methodes template?

    merci pour la reponse tres rapide

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par 5:35pm
    Je suis pas certain de comprendre, mais tu veux donc dire que les templates peuvent s'appliquer a une famille d'objet ayant des methodes communes, mais je pensais que ca pourrait poser un prob en terme se "securite du code". donc le moyen de garder le code fiable serait alors de systematiquement encapsuler les methodes template?

    merci pour la reponse tres rapide
    Quelle sécurité ?? encapsuler quoi ? Je ne comprend pas ce que tu dis.
    Les templates permettent de dire qu'une classe ou une fonction peut utiliser un objet générique qui possède telle ou telle fonction ou type. Pour chaque utilisation, on aura une nouvelle classe ou fonction.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Une autre utilisation des fonctions templates est la création de générateurs d'objets. Dans le cas où ta classe est un template avec beaucoup de paramètres, ou encore des paramètres templates (les paramètres des paramètres pouvant à nouveau être template, etec, bref on obtient une bonne imbrication lourde à écrire), il peut être plus pratique d'instancier un objet par un appel de fonction, qui se chargera de déduire le bon type des paramètres.

    Pour en revenir à l'exemple d'utilisation que donnait Miles, je ne vois pas non plus où serait le problème de sécurité de code. Les classes abstraites imposent aux classes qui en dérivent de redéfinir certaines méthodes. Si elles ne le font pas, le programme ne compile pas. Pour les templates c'est la même chose, l'utilisation d'un template impose que le(s) paramètre(s) utilisé(s) offre(nt) un ensemble de méthodes définies. S'i ce n'est pas le cas, pas de compilation non plus.

    Un bouquin vraiment sympa pour voir plein d'applications des templates est "Modern Design in C++" d'Andrei Alexandrescu, je pense que tu devrais trouver plein d'exemples qui te convaincront de l'utilité et de la puissance des templates

  6. #6
    Membre actif Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par Miles
    Quelle sécurité ?? encapsuler quoi ? Je ne comprend pas ce que tu dis.
    Les templates permettent de dire qu'une classe ou une fonction peut utiliser un objet générique qui possède telle ou telle fonction ou type. Pour chaque utilisation, on aura une nouvelle classe ou fonction.
    Ce que je veux dire par securite du code, c'est "qu'est-ce qui garantit que le type que l'appelant specifie fasse partit de la famille de type voulu par le template?".

    mais merci pour les reponse je commence a comprendre.

    J'ai deja le livre d'Alexandrescu, achete tres rescemment, mais je l'ai pas encore compris

    donc si je comprends bien, celui qui implemente des templates specialise pour une famille de type precise, ne devrait pas les laisser accessible au utilisateurs d'une bibliotheque par exemple, pour eviter qu'un mauvais type soit utilise?
    et utiliser des typedef qui les redefinissent?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par 5:35pm
    Ce que je veux dire par securite du code, c'est "qu'est-ce qui garantit que le type que l'appelant specifie fasse partit de la famille de type voulu par le template?".

    mais merci pour les reponse je commence a comprendre.

    J'ai deja le livre d'Alexandrescu, achete tres rescemment, mais je l'ai pas encore compris

    donc si je comprends bien, celui qui implemente des templates specialise pour une famille de type precise, ne devrait pas les laisser accessible au utilisateurs d'une bibliotheque par exemple, pour eviter qu'un mauvais type soit utilise?
    et utiliser des typedef qui les redefinissent?
    Il n'y a pas le choix, les templates sont disponibles pour tous. En revanche, il y a moyen de faire échouer la compilation avec des outils de Boost, faut juste que je remette la main dessus.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par 5:35pm
    Ce que je veux dire par securite du code, c'est "qu'est-ce qui garantit que le type que l'appelant specifie fasse partit de la famille de type voulu par le template?".
    Ce que tu décris là s'appelle de la généricité contrainte. Tu souhaites imposer une contrainte sur le type utilisé pour instancier la fonction ou la classe template.

    La généricité contrainte n'est pas implantée en C++, contrairement à d'autres langages.
    Elle peut néanmoins être partiellement émulée, principalement en utilisant un cheminement d'instanciation de template qui conduit à une erreur de compilation explicite.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 5:35pm
    Ce que je veux dire par securite du code, c'est "qu'est-ce qui garantit que le type que l'appelant specifie fasse partit de la famille de type voulu par le template?".
    Pour qu'un template puisse être instancié pour un type donné, il suffit que les opérations nécessaires soient définies pour le type; il n'y a pas de contrainte d'héritage.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par Miles
    Il n'y a pas le choix, les templates sont disponibles pour tous. En revanche, il y a moyen de faire échouer la compilation avec des outils de Boost, faut juste que je remette la main dessus.
    Oui notamment avec la mpl, mais même sans cela, si le type utilisé en paramètre de template ne contient pas les méthodes requises, la compilation ne pourra pas se faire (enfin dans le cas ou ces méthodes sont appelées à un moment bien sûr).

    Citation Envoyé par 5:35pm
    J'ai deja le livre d'Alexandrescu, achete tres rescemment, mais je l'ai pas encore compris
    Il est un peu indigeste au début, surtout quand on n'a pas l'habitude des templates, mais le plus intéressant pour le début est vraiment la première partie, avec le Stroustrup (ou n'importe quel autre bouquin de C++ expliquant les templates) à côté pour revenir sur les points exposés par Andrei. Ca prend un peu de temps, mais ça en vaut la peine

  11. #11
    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
    Perso, pour les templates, je préfère C++ templates, the complete guide (Jossutis et Vandevoorde). Le titre n'est vraiment pas menteur, et il y a à la fois référence et cas d'utilisation.
    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.

  12. #12
    Membre actif Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 217
    Points
    217
    Par défaut
    Merci pour les reponses, je crois que que je commence a comprendre que j'avais partiellement compris
    mais il me reste toujours des questions en suspend.
    Voici ce que j'ai pu voir des utilisation classique des templates:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <class T> void uneFonction()
     
    template <typename T> void uneAutreFonction()

    personellement je ne fais pas la difference entre typename et class.

    et ensuite, j'ai un article sur la metaprogrammation qui expose un code tel que:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <unsigned N> struct Fib
    {
       enum
       {
          Val = Fib< N-1 >::Val + Fib < n-2 >::Val
       };
    };

    Alors la, je trouve ce code tres particulier, puisque le template prend un entier non signe, qui est donc une valeur. donc en definitive, un template peut prendre un type, une valure, et en fait tout ce qu'on veut? Que peut on mettre d'autre a part des types et des valeures entieres? des char, des floats?

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 5:35pm
    Merci pour les reponses, je crois que que je commence a comprendre que j'avais partiellement compris
    mais il me reste toujours des questions en suspend.
    Voici ce que j'ai pu voir des utilisation classique des templates:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template <class T> void uneFonction()
     
    template <typename T> void uneAutreFonction()

    personellement je ne fais pas la difference entre typename et class.
    Il n'y a pas de différence entre typename et class dans ce contexte.

    et ensuite, j'ai un article sur la metaprogrammation qui expose un code tel que:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <unsigned N> struct Fib
    {
       enum
       {
          Val = Fib< N-1 >::Val + Fib < n-2 >::Val
       };
    };

    Alors la, je trouve ce code tres particulier, puisque le template prend un entier non signe, qui est donc une valeur. donc en definitive, un template peut prendre un type, une valure, et en fait tout ce qu'on veut? Que peut on mettre d'autre a part des types et des valeures entieres? des char, des floats?
    Note: ce genre de code ne fonctionne que si on utilise aussi des spécialisations explicites pour arrêter la récursion.

    Les char sont des valeurs entières en C++.

    On peut avoir des objets nommés, mais pas des floats.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Membre actif Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il n'y a pas de différence entre typename et class dans ce contexte.
    [...]
    On peut avoir des objets nommés, mais pas des floats.
    Cela sous-entends t-il que dans certain contextes, il y a une difference entre typename et class?
    Si on peut avoir des objets nommés, comment le compilateur peut il connaitre les valeurs de l'objet avant l'execution? l'objet doit il etre constant?

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par 5:35pm
    Cela sous-entends t-il que dans certain contextes, il y a une difference entre typename et class?
    Dans un cas hors définition de template, le mot-clé "class" permet de déclarer un type. Le mot-clé typename permet d'indiquer au compilateur que le membre d'un type d'argument d'un modèle est un nom de type. BOn c'est peut-être pas très clair, un exemple devrait éclaircir les choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template <class T>
    class MyClass {
     
        typedef typename T::iterator iterator;
     
    //...
    };
    typename permet d'indiquer au compilateur que T::iterator est un nom de type et non pas un attribut statique par exemple.

    Citation Envoyé par 5:35pm
    Si on peut avoir des objets nommés, comment le compilateur peut il connaitre les valeurs de l'objet avant l'execution? l'objet doit il etre constant?
    Oui, pour l'utilisation de paramètres templates, il ne peut s'agir que de paramètres connus à la compilation, donc soit des types soit des valeurs constantes. Par contre je n'ai jamais vu autre chose que des entiers comme paramètres constants, du coup cette histoire d'objets nommés m'intéresse beaucoup.

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par bolhrak
    Oui, pour l'utilisation de paramètres templates, il ne peut s'agir que de paramètres connus à la compilation, donc soit des types soit des valeurs constantes. Par contre je n'ai jamais vu autre chose que des entiers comme paramètres constants, du coup cette histoire d'objets nommés m'intéresse beaucoup.
    Voilà quelques exemples de choses possibles (voir C++ Templates The Complete Guide, D. Vandevoorde et N.M. Josuttis):

    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
    int a;  // globale ou membre statique
    extern char const hello[] = "Hello world!"; // extern est nécessaire
    void f();
    template <typename T> void g();
    class X { int n; };
     
    template <typename T, T p> class C;
     
    C<int, 42> c1;
    C<int*, &a> c2;
    C<int&, a> c3;
    C<void (*)(), &f> c4;
    C<void (*)(), &g<double> > c5;
    C<int X::*, &X::n> c6;
    C<char const*, hello> c7;
    // C<char*, "toto"> c8;  invalide
    // C<double, 1.2> c9; invalide
    // C<int*, (int*)0> c10; invalide
     
    template <typename T, int T::*> class D;
    C<X, &X::n> d1;
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Merci beaucoup pour les exemples

    Je m'apperçois que certains me sont en fait familiers, surtout l'utilisation des pointeurs de fonction comme paramètre template (oui j'ai oublié de le préciser dans mon précédent message).

Discussions similaires

  1. Utilisation des templates
    Par vanitom dans le forum MFC
    Réponses: 21
    Dernier message: 01/08/2007, 11h07
  2. Réponses: 1
    Dernier message: 18/04/2006, 12h24
  3. [XSL]portée des templates??
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/02/2006, 10h53
  4. [XSL] utilisation des templates
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/12/2005, 15h54
  5. Utilisation des templates
    Par mikky dans le forum C++
    Réponses: 1
    Dernier message: 14/09/2005, 12h59

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