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 :

[templates] template et factorisation de code


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [templates] template et factorisation de code
    Bonjour,

    Je débute en C++ avec les templates, le problème suivant est surement trivial.

    j'ai un template de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class MyType> class MyTemplate
    {
        ...
    }
    Lorsque je l'instancie dans mon programme, je ne connais pas myType.

    Je fais donc un switch sur le type :

    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
     
    switch (type)
    {
        case TYPE_A:
        {
            MyTemplate<TypeA> myTemplate;
            ...
        }
        case TYPE_B:
        {
            MyTemplate<TypeB> myTemplate;
            ...
        }
        ...
    }
    Je cherche un moyen de factoriser ce code, sachant que les opérations après l'instantiation du template sont les mêmes.

    J'ai beau chercher, je ne trouve pas sur internet de solutions satisfaisantes.

    Merci de votre aide.

    Chris

  2. #2
    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
    Deux approches de solutions:
    - tu donnes a template <class MyType> class MyTemplate une classe de base non template qui a comme membres virtuels les operations dont tu as besoin. Lors de l'instantiation tu recuperes un pointeur ou une reference et le tour est joue (mais attention a la duree de vie).
    - tu fais un template de ta fonction et c'est l'appelant qui fait le switch.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    J'ai choisi de faire un template de la fonction.

    Merci pour la réponse.

    Christophe

  4. #4
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Une solution peut peut-être passée par les classes traits. Cf l'excellent tutoriel de Alp:http://alp.developpez.com/tutoriels/traitspolicies/

  5. #5
    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 3DArchi Voir le message
    Une solution peut peut-être passée par les classes traits. Cf l'excellent tutoriel de Alp:http://alp.developpez.com/tutoriels/traitspolicies/
    Est-ce que tu pourrais etendre? Le probleme tel que je l'ai compris est un probleme de choix dynamique de comportement. Les classes de traits sont un mecanisme statique. Je ne vois pas en quoi elles offriraient une approche de solution.

  6. #6
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    On n'a pas tous les détails de son problème. Des fois on peut partir sur une solution qui amène un autre problème qui amène la question. Alors, proposer une autre piste c'est peut-être une façon aussi de revoir le problème à la base.

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Ici il s'agit de choix à l'exécution... Donc on ne peut pas factoriser statiquement le comportement dynamique.

    Par contre, je soupçonne un petit soucis dans ta conception... ou plutôt une perfectibilité. Je me débrouille toujours pour éviter de faire un switch sur le type de mes objets. Je factorise statiquement ce qui est factorisable statiquement, et dynamiquement ce qui ne l'est pas statiquement. Mais pas de switch... La solution n°1 donnée par Jean-Marc est celle que j'utilises généralement car elle offre une plus grande facilité de maintenance/évolution de code.

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

Discussions similaires

  1. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  2. factoriser du code
    Par grabriel dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2006, 15h00
  3. Réponses: 7
    Dernier message: 01/08/2006, 11h58
  4. template<template<>>
    Par joker34 dans le forum C++
    Réponses: 7
    Dernier message: 25/01/2006, 09h45
  5. Réponses: 4
    Dernier message: 06/11/2003, 10h37

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