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 :

Comment faire un Dynamic cast en c++ d un type avec template


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Comment faire un Dynamic cast en c++ d un type avec template
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // code
    class maSuperClass {.. }
     
    template<short T>
    class classFille {... }
     
    classFille<3> fils;
    maSuperClass sup = fils; // Affectation sans probleme
    Le probleme de retrouver le vraie type maintenant, j essyes de faire un dynamique cast.Le probleme que le type est dynamique selon l'instanciation de l'utilisateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fils = dynamic_cast<classFille<3> > sup; //Ok ça marche mais je ne sais pas d'avance la valeur de template.La question y'a t'il un moyen d'avoir ce type dynamiquement selon l instance (eg: typeid).
     
    fils = dynamic_cast<typeid(fils)> sup; //Erreur ça marche pas , pourquoi ???
    Merci,

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonsoir,

    Tout d'abord le dynamic_cast ne devrait être fait que par référence ou pointeur car sinon il y as ce qu'on appel du "slicing". http://en.wikipedia.org/wiki/Object_slicing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fils = dynamic_cast<typeid(fils)> sup; //Erreur ça marche pas , pourquoi ???
    C'est impossible en C++ standard, mais il n'y en as aucun besoin. Tous simplement pacque si tu écrit cette ligne de code c'est que tu connais forcement le type de "fils" et donc pas besoin de le faire deviner au compilateur au cour de l'exécution(ce qui est impossible puisque le type doit être connu a la compilation).
    Par exemple si j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classFille<2> fils = dynamic_cast<classFille<2> > sup; //On connais forcement déjà le type de fils.
    Maintenant si le problème c'est juste que ça t'embête d'écrire deux fois la même chose... dit toi que c'est pour te dissuader de le faire, car en général on évite.
    Si tu nous en dit plus sur ton problème, nous pourrons peut-être te dire comment l'éviter.

  3. #3
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre réponse,c'est vraie que je dois connaitre le type mais mon problème que le type est avec une template, donc au niveau de main l'utilisateur va instanciée une instance (ex: fils<2> ou fils<3>) et c'est pour cela que j'essaye de faire un cast dynamic.En d'autre terme je sais que je vais avoir un objet de type fils mais avec quoi comment valeur de template non.
    Comment je peux faire ça.En fete je devellope une communication en SystemC (librairie c++) d'un module Maitre et un Esclave qui envois/reçois un paquet de donnée.Ce paquet va être créer selon l'état de maitre en d'autre terme de Type (fils<2> ou fils<3>).Le problème c'est comment retrouver mon objet après que je l'ai mis dans un container de type mère ou parent.

    Merci,

  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
    Salut,
    Je penses que tu tombes pas loin du problème évoqué par le dernier article de Alp : Type Erasure. Tu as besoin de définir une abstraction au dessus de fils<N> et t'en servir ensuite comme interface dans ton main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class FilsBase
    {//...};
    template<int n> class Fils : public FilsBase
    {};
     
    //
    int main()
    {
       FilsBase * p_fils = CreerFils();// Creer fils creer un Fils<2> ou Fils<3> selon besoin
       p_fils->DoIt();
    }

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class FilsBase{int x_1; //...};
    template<int n> class Fils : public FilsBase{int x_2; //...};
     //
    int main()
    {
       FilsBase * p_fils = CreerFils();// Creer fils creer un Fils<2> ou Fils<3> selon besoin
       cout<<p_fils->x_1<<endl; // Ok  visible
       cout<<p_fils->x_2<<endl; // N'est pas visible
    }
    Pour accèder au variable de classe (X_2) il faut faire un cast (Fils <n>)Le problème comment affectè n à 2 ou 3.
    J'espère trouver une solution comme par exemple, mettre une variable de type (dynamic_cast<variableType>):
    cout<<(dynamic_cast<typeid(p_fils)> p_fils)->x_2<<endl; //EREUR
    Merci,

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/06/2010, 04h13
  2. Réponses: 1
    Dernier message: 14/08/2007, 12h14
  3. Réponses: 1
    Dernier message: 17/06/2007, 14h19
  4. Réponses: 1
    Dernier message: 10/06/2007, 08h22

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