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 :

Fait un dynamic cast en spéciant le RTTI en compilation.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Fait un dynamic cast en spéciant le RTTI en compilation.
    Salut, j'ai lu que dynamic_cast utilise le RTTI pour faire le cast d'un objet de base vers un objet dérivé.

    Alors ce que je voudrais savoir c'est si il y a moyen de faire ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dynamic_cast<object->getType()>(object);

    Ou getType() me renvoie juste une variable de type type_info. (Donc contenant les informations sur le type de l'objet à l'exécution)

    Le problème c'est que ça ne compile pas il me dit espected type specifier before object.

    Alors je voudrais savoir si il n'y a pas un moyen de dire au compilateur de ne pas évaluer ça à la compilation mais de laisser le code compiler pour que ça fasse le cast à l'exécution ???

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Non, pour la bonne raison que les casts se font sur des types et non sur des valeurs. Et il y a un constat très simple à faire : les types manipulés ne sont pas dynamique (le type réel si, mais on ne peut le connaître sans plus d'information que le type manipulé).
    Quant il faut "dynamiser les types", tu peux aller de l'avant (appeler des fonctions avec des types différents en fonction de valeur) mais jamais reculer car le type de retour ne changera pas. En fait, seul les prototypes des fonctions et un graph d'appel suffisent pour suivre l'évolution d'un type.

    Même chose pour les valeurs constexpr/template.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    @Lolilolight: Non tu ne peux pas, car tu ne pourrais pas déclarer la variable dans laquelle tu mettrais le résultat (vu qu'elle n'aurait pas de type connu).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Déjà, il faut savoir que, si tu te trouves face à une situation dans laquelle tu dois utiliser le dynamic_cast, c'est très vraisemblablement le symptôme d'un problème de conception dans le sens où "tu as été assez bête" pour en arriver à connaitre un objet selon son type de base plutôt que selon son type le plus dérivé.

    A partir de là, il y a bien quelques circonstances toutes particulières dans lesquelles le dynamic_cast peut s'avérer intéressant voire indispensable, mais de manière générale, tu ne devrais jamais envisager de l'utiliser pour déterminer si ton objet qui passe pour être du type de base est un objet d'un type dérivé donné. Les mots clé pour t'en sortir sont virtualité des fonctions, pour être en mesure de faire varier le comportement d'un objet en fonction de son type réel et double dyspatch pour pouvoir demander à l'objet d'agir selon les capacités de son type le plus dérivé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok je vois je vais essayer de m'en sortir avec du double dispach alors..., bon, dans le cas des méthodes template qui ne peuvent pas être virtuelles là je n'ai pas le choix, je suis obligé d'utiliser une fonction qui renvoie un std::string sur le type de l'objet et de faire un cast si je veux effectuer un action sur l'objet dérivé.

    Par exemple, comme ici :

    Code cpp : 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
     
     template <typename C>
        bool intersects(BoundingVolume<C>& other) {
            //if(static_cast<C&>(other)) {
                if (children.size() == 0 && other.children.size() == 0) {
                    return intersects(dynamic_cast<C&>(other));
                }  else if (children.size() == 0 && other.children.size() != 0) {
                      for (unsigned int i = 0; i < other.children.size(); i++) {
                          if (other.children[i]->getType() == "BoundingBox")
                              if (intersects(dynamic_cast<BoundingVolume<BoundingBox>&>(*other.children[i])))
                                    return true;
                      }
                } else {
                    for (unsigned int i = 0; i < children.size(); i++) {
                        if (other.children.size() == 0) {
                            if (children[i]->getType() == "BoundingBox")
                                if (static_cast<BoundingVolume<BoundingBox>*>(children[i])->intersects(static_cast<BoundingVolume<C>&>(other)))
                                    return true;
     
                        } else {
                            for (unsigned j = 0; j < other.children.size(); j++) {
                                if (children[i]->getType() == "BoundingBox" && other.children[i]->getType() == "BoundingBox")
                                    if (static_cast<BoundingVolume<BoundingBox>*>(children[i])->intersects(static_cast<BoundingVolume<BoundingBox>&>(*other.children[j])))
                                        return true;
                            }
                        }
                    }
                }
            //}
            return false;
        }

    Vu que mes différents types de volumes doivent être stocké dans un contenaire je suis obligé d'utiliser le pattern CRTP et type erasure, donc, je suis également obligé de faire un cast.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Si tu pars sur un tel principe, tu t’ampute littéralement de trois doigts!!!!

    Non, ce que tu peux faire, étant donné que tu pars visiblement sur du CRTP, c'est faire en sorte d'avoir un alias de type (DataType, par exemple) qui corresponde au paramètre template de ta classe, et une fonction qui renvoie une référence (constante au besion) sur l'objet en question.

    Cela donnerait un truc du genre de
    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
     
    template <typename T>
    class Interface{
        public:        using DataType = T;
            DataType /* const */ & data() /* const*/{return t_;}
        protected:
            Interface(T & t) : t_(t){}
            ~Interface(){}
        private:
            T & t_;
    };
     
    class MaClasse : public Interface<MaClasse>{
     
        public:
            MaClasse():Interface<MaClasse>(*this){}
            void foo():
            /*... */
    }
    template <typename T> 
    void bar(Interface<T> const &  iface){
        iface.data().foo();
    }
    Avec la spécialisation partielle, rien ne t'empêche de prévoir d'autres comportements que foo en cas de besoin
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. le dynamic cast
    Par jeanjack dans le forum Débuter
    Réponses: 2
    Dernier message: 13/04/2009, 20h28
  2. Problème de dynamic casting
    Par Colbix dans le forum C++
    Réponses: 5
    Dernier message: 25/03/2009, 17h55
  3. dynamic cast utilisé pour une recherche
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/02/2009, 21h17
  4. Réponses: 10
    Dernier message: 17/07/2008, 20h01
  5. dynamic cast
    Par leycho dans le forum Langage
    Réponses: 7
    Dernier message: 03/01/2006, 13h47

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