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 :

[template] récuperation du type en compile time


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut [template] récuperation du type en compile time
    Bonjour,

    ca fait 4 mois que je fais du c++, et la je suis confronté à un problème pour lequel je ne trouve pas de solution.

    mon problème est le suivant :

    j'ai des classes par exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A{
    int a;
    };
     
    class B : public A{
    int b;
    };
     
    et une fonction template :
     
    template<class C>
    void F(C obj){
    ...
    }
    pour ce type de déclaration :

    lors de l'appel F(*a) il prend que *a est de type A, y'a t'il un moyen pour que je detecte que *a est de type B pour que je puisse passer cette info à ma fonction ?

    merci d'avance pour vos réponses.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tu manipules ton B en tant que A, c'est que tu veux tirer partie du polymorphisme. Alors pourquoi avoir besoin de retrouver le fait qu'il s'agit d'un B ?

    En plus si tu as une fonction template, c'est que tu veux appliquer un traitement générique. Alors pareil, pourquoi avoir besoin de distinguer le fait que ce soit un B et pas un A ?

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    en fait mon pb est que l'utilisation des classes et des templates est séparé :
    j'ai une hiérarchie de classes, dans ses classes j'ai des déclarations d'attributs.
    à ces classes j'applique un mécanisme de template qui retrouve les déclarations d'attributs et qui essaie d'appliquer aux valeurs des attributs un certain traitement. le problème c'est que pour les attribut de type pointeur, je doit impérativement appliqué le traitement à l'objet pointé et d'ou mon probléme de reconnaissance du type dynamique.
    j'espere que j'ai été clair.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Au moment ou tu compiles ton appel, la classe la plus derivee n'existe peut-etre pas encore. Appeler un template instantie avec cette classe est donc problematique.

    Ce qui est peut-etre possible de faire, c'est de passer le parametre de F par reference (constante?) et donc pouvoir profiter du dispatch dynamique sur les membres virtuels de A dans F.

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    merci pour votre réponse, effectivement ca marche, j'arrive à appeler les méthodes virtuelles de l'obj, mais je me suis rendu compte que je bloquait encore :

    en fait dans ma fonction template F j'appele une autre fonction template:

    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
    template<class T>
    void F(T& obj){
      ...
    ser<T>(obj);
     
    ...
    }
     
    avec ser :
     
    template <class AM_>
    void ser(typename AM_::LastMeta::ClassType& c)
    { 
    ..
    }
    cette fois ci je doit specialiser le template de ma fonction ser avec la classe T(le type dérivé), voyez vous une solution ?
    merci d'avance.

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 13
    Par défaut
    en fin de compte j'ai ajouté une méthode virtuelle à l'intérieur de chaque classe pour faire du polymorphisme dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void F(T& obj){
    ...
    obj->f();
     
    ...
    }
    et c'est elle qui va s'ocupper d'appeler la fonction templatisé.
    merci pour vos réponses.

Discussions similaires

  1. [Template] Récuperer le nom du type generic
    Par NeoKript dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 08/11/2010, 17h33
  2. Réponses: 2
    Dernier message: 04/07/2007, 17h12
  3. template spécification du type possible
    Par MatRem dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 14h47
  4. récuperer le type mime à partir du fichier
    Par isma92 dans le forum Langage
    Réponses: 3
    Dernier message: 09/02/2007, 11h28
  5. Comment récuperer le type de champs ?
    Par lonycc dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/02/2007, 12h40

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