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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    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 confirmé Avatar de 5:35pm
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 201
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

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