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 :

Templatisation de typedef ?


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 705
    Points
    2 705
    Par défaut Templatisation de typedef ?
    Hello,

    Est-il possible de faire un typedef templatisé pouer quelque quelque chose comme ça ?

    Merci.

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class T> struct MaMethodeTrait
    {
       typedef T* (*MonTypeDeMethode)(const char *);
    };
    Puis ensuite:
    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
    int* UneFonction(const char*)
    {
       return NULL;
    }
    char* UneAutreFonction(const char*p)
    {
       return NULL;
    }
     
    typedef unsigned char T[5];
    int main()
    {
       MaMethodeTrait<int>::MonTypeDeMethode L_pfnMaMethode;
       L_pfnMaMethode = UneFonction;
       L_pfnMaMethode("t");
       MaMethodeTrait<char>::MonTypeDeMethode L_pfnMaMethode2;
       L_pfnMaMethode2 = UneAutreFonction;
       L_pfnMaMethode("a");
       return 0;
    }

  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 705
    Points
    2 705
    Par défaut
    Hmmm... Merci pour cet exemple, mais je crois qu'il ne correspond pas à mon besoin, parce que j'ai mal formulé la chose.

    En fait, je veux templatiser l'expression (que je sais incorrecte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef (T* (*MonTypeDeMethode)(const char *)) version_courte;
    pour une utilisation dans ce gerne là :

    Si c'est effectivement ce que tu avais compris, c'est que je suis très mauvais. :-)

  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
    Citation Envoyé par oodini Voir le message
    Si c'est effectivement ce que tu avais compris, c'est que je suis très mauvais. :-)
    J'avais compris, mais loin de moi d'oser mettre en doute tes capacités.
    A part la solution que je t'ai donnée ou l'utilisation d'une macro, je ne vois pas.

  5. #5
    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
    C'est moi qui ai mal du expliquer ma méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class T> struct MaMethodeTrait
    {
       typedef T* (*version_courte)(const char *);
    };
    Et ensuite, l'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaMethodeTrait::version_courte<T>

  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
    P.S.: j'ai quand même l'impression que tu as résolus ton problème de fabrique avec une solution qui te créés encore plus de problème (cette question et les questions dans boost)... Fais un petit tour sur la FAQ sur les politiques et les traits (merci Alp), je pense que cela pourra beaucoup t'apporter dans ce que tu es en train de faire.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu ne peux pas avoir version_courte<T>, mais uniquement version_courte<T>::type.
    Boost ftw

  8. #8
    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
    Petite faute de frappe (ou faute de petite frappe?). Dsl

  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 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    P.S.: j'ai quand même l'impression que tu as résolus ton problème de fabrique avec une solution qui te créés encore plus de problème (cette question et les questions dans boost)... Fais un petit tour sur la FAQ sur les politiques et les traits (merci Alp), je pense que cela pourra beaucoup t'apporter dans ce que tu es en train de faire.
    Ben les traits (d'après ce que je crois comprendre) m'aideraient pour le problème exposé ici, mais pour mon histoire de fabrique (cf section boost), je en vois pas trop en quoi.

  10. #10
    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
    J'ai pas toute les billes de ton pb,mais voilà ce que j'ai compris. Tu veux associer une classe A avec une classe B. C'est à dire pouvoir créer un objet de type B quand on te fourni un objet de type A. Dans un premier temps, tu es parti sur un patron de fabrique, ce qui me semble plutôt une bonne idée. Mais pour associer les deux classes, tu cherche à utiliser une map entre un nom de classe "A" et une fonction de création d'objet B. Et là, tu coince (d'où ce fil et celui de boost). Je pense qu'utiliser une classe trait et la spécialiser partiellement (comme présenté dans le fil http://www.developpez.net/forums/d61...tron-fabrique/) est plus adéquat et devrait solutionner tes deux problèmes.
    Mais, bon, j'ai pas toute les billes de ton projet, alors c'est vrai que ma solution peut ne pas être complètement appropriée. Mais, à mon avis, tu devrais prendre le temps d'essayer cette piste.

  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 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'ai pas toute les billes de ton pb,mais voilà ce que j'ai compris. Tu veux associer une classe A avec une classe B. C'est à dire pouvoir créer un objet de type B quand on te fourni un objet de type A.
    Non. Je veux créer un objet A quand me fournit la chaine de caractères "objetA".

    Map [ chaîne | pointeur de fonction ].
    Ladite fonction me créant un objet du type donné.

    Dans un premier temps, tu es parti sur un patron de fabrique, ce qui me semble plutôt une bonne idée. Mais pour associer les deux classes, tu cherche à utiliser une map entre un nom de classe "A" et une fonction de création d'objet B.
    Là, c'est plus juste. :-)

    Et là, tu coince (d'où ce fil et celui de boost). Je pense qu'utiliser une classe trait et la spécialiser partiellement (comme présenté dans le fil http://www.developpez.net/forums/d61...tron-fabrique/) est plus adéquat et devrait solutionner tes deux problèmes.
    Je vois plus ce que tu proposes comme une solution alternative.
    Mais à vrai dire, ce que j'ai actuellement fonctionne, mais foire quand je mets le map et la fonction en statique. Je ne pense pas que ton trait résoudra ce problème (si ?).

    Mais je vais tout de même regarder les traits pour le problème ayant motivé ce post. Mais s'il faut en passer par des dizaines de spécialisations de template, ça n'a pas beaucoup d'intérêt. L'utilisation du trait pour chaque type sera en effet unique.
    De même, l'interrogation d'un trait pour connaître le type de l'objet traité m'est inutile, car je connais déjà le type. Je veux juste alléger une écriture pour un transtypage.

  12. #12
    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 705
    Points
    2 705
    Par défaut
    En fait, pour la dernière ligne, j'ai probablement tort.

    J'aurai sans doute besoin de connaître le type lorsque je voudrai appliquer un auto_ptr à l'objet renvoyé par le pointeur de fonction stocké dans le map.

    Cela se présentera sûrement lundi. :-)

  13. #13
    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
    Citation Envoyé par oodini Voir le message
    Non. Je veux créer un objet A quand me fournit la chaine de caractères "objetA".
    En fait dans ton post, tu disais:
    Je dispose du type de l'objet en question (fourni par une fonction membre), sous forme de chaîne...
    Donc, j'en déduit qu'au moment où tu souhaite créer ton nouvel objet, tu as mieux qu'une chaîne de caractère: tu as le type de la classe.
    Citation Envoyé par oodini Voir le message
    Je vois plus ce que tu proposes comme une solution alternative.
    Oui
    Citation Envoyé par oodini Voir le message
    Mais à vrai dire, ce que j'ai actuellement fonctionne, mais foire quand je mets le map et la fonction en statique. Je ne pense pas que ton trait résoudra ce problème (si ?).
    Non. (joke: ce que j'ai actuellement fonctionne, mais foire : c'est ça fonctionner?)

    Citation Envoyé par oodini Voir le message
    Mais je vais tout de même regarder les traits pour le problème ayant motivé ce post. Mais s'il faut en passer par des dizaines de spécialisations de template, ça n'a pas beaucoup d'intérêt. L'utilisation du trait pour chaque type sera en effet unique.
    En fait, soit tu passes par des dizaines de spécialisations de template, soit tu passes par des dizaines de remplissage de map .


    Une map est plus appropriée pour le thread de vikki. Car lui, il ne connait pas la classe à instancier au moment de la compilation. Elle lui est donnée par la lecture de son fichier. Par contre, j'ai l'impression que lorsque tu veux instancier 'Poppins' tu sais que c'est à partir de 'Mary'. Ce sera certainement plus robuste et performant si ton association est construite/vérifiée au moment de la compilation. C'est ce que te permet le concept des traits/politiques.

  14. #14
    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 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En fait, soit tu passes par des dizaines de spécialisations de template, soit tu passes par des dizaines de remplissage de map .
    Je passerai de toute façon par des dizaines de remplissage de map.
    Mon souci était de simplifier l'écriture. Et apparemment, c'est mort.

  15. #15
    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
    C'est ce que je disais aussi dans le thread de vikki. Le remplissage des map peut être certainement un peu alléger (dans l'écriture) avec boost::assign.

  16. #16
    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 860
    Points
    11 860
    Par défaut
    Sinon, le template typedef tel que tu souhaiterais le faire va arriver avec C++0x

Discussions similaires

  1. [typedef] protection à travers les espaces de noms
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 7
    Dernier message: 02/02/2005, 20h21
  2. [typedef]Question bete...
    Par danael dans le forum C
    Réponses: 7
    Dernier message: 30/08/2004, 12h30
  3. Réponses: 3
    Dernier message: 20/12/2003, 19h53
  4. Réponses: 6
    Dernier message: 26/01/2003, 13h45
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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