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

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    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 émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  4. #4
    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
    Points : 3 156
    Points
    3 156
    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
    Find me on github

  5. #5
    Membre chevronné
    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 : 43
    Localisation : France, Essonne (Île de France)

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

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

  6. #6
    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.

  7. #7
    Membre éprouvé 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 : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    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 ?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    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.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    J'étais parti sur un template général, qui appelait en son sein un template spécialisé selon ce que je traite. Mais comme il y a dans l'histoire une boucle, ça m'oblige à faire des appels de template en boucle, et je ne pense pas que ça soit raisonnable en termes de temps d'exécution.

  10. #10
    screetch
    Invité(e)
    Par défaut
    les template sont résolus a la compilation, ca ne coute rien a l'éxécution.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Bon, je vais expliciter un peu plus clairement mon problème, en le simplifiant grandement.

    Pour l'instant, en gros, j'ai ça :

    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
    33
    34
    35
    class A
    {
        int membre_a;
    };
     
    class B
    {
        int membre_b;
        float membre_c;
        double membre_d;
    };
     
    class C
    {
        double membre_e;
        int membre_f;
    };
     
    void maFonction(A param)
    {
        process(A.membre_a);
    }
     
    void maFonction(B param)
    {
        process(B.membre_b);
        process(B.membre_c);
        process(B.membre_d);
    }
     
    void maFonction(C param)
    {
        process(C.membre_e);
        process(C.membre_f);
    }
    J'aimerais avoir quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    maFonction(T param)
    {
        pour chaque membre de T
            process(T.membre_?)
    }
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    maFonction(T param)
    {
        pour certains membres de T
            process(T.membre_?)
    }

  12. #12
    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
    Points : 3 156
    Points
    3 156
    Par défaut
    Joel F a raison, ton use case est quasiment celui de la doc de Fusion si on regarde ceci puis ceci. Tu dois bien sûr écrire un BOOST_ADAPT_STRUCT pour chaque type, c'est ensuite réutilisable avec n'importe quel algo de fusion.

    De toute façon, tu serais obligé d'instrumentaliser le code à un endroit ou un autre, car C++ ne fournit pas d'introspection.
    Find me on github

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Effectivement, je suis convaincu que Boost.Fusion serait la solution.

    Malheureusement, il ne m'est pas possible de l'utiliser.

  14. #14
    screetch
    Invité(e)
    Par défaut
    si tous tes types ont des members différents, tu vas sans doute galérer quelle que soit la solution.
    Si comme tu le dis 95% des types utiliseront membre_a et seuls 5% utiliseront des membres spéciaux alors je n'ai toujours pas compris ce que tu as contre la spécialisation de template.

    Dépendant de la taille du problème mais boost.fusion est l'artillerie lourde; plus configurable et plus générique (le type importe peu, pour peu qu'il ait soit membre_a, membre_b ou etc etc) mais c'est pas forcément ce dont tu as le plus besoin.

    De plus on parle de combien de types la? 2? 10? 100?

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Citation Envoyé par screetch Voir le message
    si tous tes types ont des members différents, tu vas sans doute galérer quelle que soit la solution.
    Si comme tu le dis 95% des types utiliseront membre_a et seuls 5% utiliseront des membres spéciaux
    Non. 95% du code n'est pas dépendant des membres des types, mais les 5% restants vont taper sur tous les membres de chaque type.

    Citation Envoyé par screetch Voir le message
    De plus on parle de combien de types la? 2? 10? 100?
    Ce que j'ai présenté est assez réaliste en termes de nombres de classes et de membres.
    La principale différence est qu'il y a du code autour des appels à process(), et que cela se situe dans une boucle, car on bosse en fait sur les éléments d'un vecteur (qui est passé en paramètre à maFonction).

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