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 :

Désigner des membres par des noms


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Désigner des membres par des noms
    Hello,

    Bon, voici mon problème :

    J'ai un traitement identique à faire sur des objets de types différents.
    Donc, youpi, on pense à un template de fonction/méthode.

    Sauf que... 5% de ce code concerne en fait des membres spécifiques à chaque type.

    Pour faire simple avec les types A et B, j'aimerais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pA->val1 = 5
    pB->val2 = 5
    avec des templates. C'est un non sens, me direz-vous. Mais n'oubliez pas les 95 % restants, qui eux profiteraient pleinement des templates.

    Y a-t-il moyen de faire varier le nom du membre avec des paramètres de la méthode ? Avec des traits, ou que sais-je ?...

    Merci.

  2. #2
    screetch
    Invité(e)
    Par défaut
    ca s'appelle la spécialisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //generique
    template< typename T > void doStuff(T* t) { t->val = 0; }
     
    // version spéciale pour A
    template<  > void doStuff<A>(A* a) { a->val1 = 5; }
     
    // version spéciale pour B
    template<  > void doStuff<B>(B* b) { b->val2 = 5; }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Si je fais ça, je n'ai plus besoin de templates. :-)

  4. #4
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par oodini Voir le message
    Si je fais ça, je n'ai plus besoin de templates. :-)
    ben... les 95% utiliseront la version template générale et les 5% la version sécialisée...
    je comprend pas le problème.

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Je suis tout à fait d'accord avec screetch.

    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
    26
    27
    28
    29
    30
    31
    32
    // Générique
    template <typename T>
    void doSpecificStuff(T* t)
    { ... }
     
    // Spécialisation pour A
    template <>
    void doSpecificStuff(A* a)
    {
        a->val1 = 5;
    }
     
    // Spécialisation pour B
    template <>
    void doSpecificStuff(B* b)
    {
        b->val2 = 5;
    }
     
    (...)
     
     
    // La fonction qui fait tout le boulot, du moins vu de l'extérieur
    template <typename T>
    void doStuff(T* t)
    {
        (...) // Un bout des 95% de code générique
     
        doSpecificStuff(t); // Les 5% de code incriminés
     
        (...) // L'autre partie des 95% de code générique
    }
    ... non ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'ai réfléchi au problème hier soir, et il ya effectivement peut-être moyen de m'en sortir par des spécialisations à des endroits rpécis de mon code. Je vous tiens au courant dans les prochains jours.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    C'est aussi faisable avec de l'introspection.

    Laurent Gomilla a écrit une lib d'introspection en C++, CAMP. Mais on dirait qu'il ne l'a maintient plus beaucoup

  8. #8
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Ou boost.fusion en adaptant ta structrure sous forme de fusion::map

Discussions similaires

  1. Tuer des processus par leur nom
    Par tedparker dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 16h19
  2. Réponses: 4
    Dernier message: 30/05/2006, 17h21
  3. Recherchez les noms débutant par des chriffres ou des /[% ..
    Par jack1234 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/09/2005, 19h55
  4. comment récupere des element par le nom de la balise?
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/08/2005, 19h59

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