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 :

Identifier type de données et instance de classe


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut Identifier type de données et instance de classe
    Bonsoir,
    J'ai un tableau de pointeurs (void *) dans lequel je stoque les adresses d'objets de n'importe quel type partant du bool, int, double vers les objets instances de classes.
    J'aimerai bien identifier chaque élément de mon tableau et savoir si c'est un type de données C/C++ ou bien un objet en évitant un très longue code de vérification tel que :
    if(typeid(*(int *)pv) == typeid(int)) {
    } else if...

    Dans l'attente de vos réponses, veuillez agréer mes demoiselles, dames et messieurs mes remerciéments et salutations les plus distingués.

  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
    Par défaut
    Salut,
    Pourquoi ne pas utiliser boost.any ou boost.variant selon ton besoin ?

  3. #3
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    C'est un petit projet personnel auquel j'aimerai ne pas utiliser de bibliothéque supplémentaire. J'ai testé une petite hack qui consiste à convertir un pointeur d'un type de données standard en un pointeur d'objet d'une classe et le passé à typeid. Si le pointeur n'est pas un pointeur vers un objet d'une classe le typeid léve une exception std::__non_rtti_object mais je suis persuadé que la gestion des exceptions coute très chers en ce qui concerne le temps CPU.

    Je me demande si y a une solution propre et portable...
    Merci.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par emmr.rida Voir le message
    Bonsoir,
    J'ai un tableau de pointeurs (void *) dans lequel je stoque les adresses d'objets de n'importe quel type partant du bool, int, double vers les objets instances de classes.
    J'aimerai bien identifier chaque élément de mon tableau et savoir si c'est un type de données C/C++ ou bien un objet en évitant un très longue code de vérification tel que :
    if(typeid(*(int *)pv) == typeid(int)) {
    } else if...

    Dans l'attente de vos réponses, veuillez agréer mes demoiselles, dames et messieurs mes remerciéments et salutations les plus distingués.
    Ca sent la mauvaise conception. Pourquoi as tu besoin de stocker dans du void* des choses aussi heterogenes que des int, bool, ... ?
    Le C++ est tel que void* devrait etre banni, au moins dans les conteneurs.

    PS/ viendrait tu de Java ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Non, je viens du dotnet et avant je viens du C/C++.
    A vrai dire j'essais de réaliser un Garbage Collector en C++. Gérer une Heap spéciale pour les blocks mémoire alloués me semble un investissement très cher pour un petit projet personnel (juste pour le plaisir de la programmation durant mon temps libre). Donc, je stoque les adresses mémoire alloués dans une hash table et j'ai besoin de connaitre le type de chaque block mémoire pour libération propre. Donc si y a des suggestions, je suis prenant!
    Merci pour vos réponses.

  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
    Par défaut
    Utilises des pointeurs intelligents. Un article Pointeurs intelligents de Loïc Joly présente très bien la chose. Les pointeurs intelligents sont le garbage collector du C++.

  7. #7
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    J'ai déjà crée une implémentation spéciale des pointeurs intelligents pour mon petit system et la FAQ et les articles DVP m'ont bien aidé...
    J'aimerai bien continuer avec la structure actuelle de mon GC et à tout problème étrange la solution est aussi étrange, non?

  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
    Par défaut
    Pour ton GC, utilise tes pointeurs intelligents alors. Pourquoi rajouter une couche ?
    Sinon, éventuellement quelque chose comme ç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
     
    struct GC_ElementBase
    {
       virtual  ~GC_ElementBase()=0;
    };
    template<class T>
    struct GC_Element : public GC_ElementBase
    {
       ~GC_Element(){}
       emmr::smart_ptr<T> element;
    };
     
    struct GC
    {
    std::vector<GC_ElementBase> allocations_en_cours;
    };
    A la réflexion, n'utiliserais-tu pas des void* car l'approche générique posait problème ? Peut être que l'article de Alp sur le Type Erasure est une réponse à ton problème de base ?

  9. #9
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    pour ton GC en C/C++ as tu penser a regarder par là

    http://www.hpl.hp.com/personal/Hans_Boehm/gc/
    http://developers.sun.com/solaris/articles/libgc.html

    d'autres personnes se sont déjà attaqué au sujet.

  10. #10
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Le premier je l'ai déjà vu, le deuxième je vais le voir surement. Merci.
    Y en a aussi sur CodeProject.com

  11. #11
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Ceci dit implémenter un garbage collector en c++, je ne sais pas si ce ne serias ps plus simple de passer a java dans ce cas.

  12. #12
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    C'est pas ça la question, c'est juste une idée qui m'est passée par la tête et je voulais essayer mais je crois que j'ai bloqué grave!

  13. #13
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Merci 3DArchi pour tout...
    Merci pour l'analyse de mon code, les conseils, les corrections et les suggestions...

  14. #14
    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
    Par défaut
    Salut,
    Pour continuer dans ton projet, il serait intéressant de surcharger les opérateurs globaux new/new[] et delete/delete[] pour que l'enregistrement vers ton GC se fasse automatiquement (en invoquant le GC dans cette surcharge).
    Autre remarque : l'appel au destructeur se fait au moment où tu récupères la mémoire. C'est un comportement de Java, mais assez inhabituel au C++ où on s'attend à ce que le destructeur soit appelé au moment où on demande la libération du pointeur. Ca peut être perturbant. Rien n'empêche d'appeler le destructeur explicitement et de ne libérer la mémoire que plus tard (à articuler avec la suggestion précédente de surcharge des opéreteurs delete).
    Enfin, tu pourrais apporter un peu de généricité à ton GC en 'politisant' la récupération de la mémoire (tuto sur les classes politiques).
    Voilà quelques idées pour occuper ces mois d'été

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

Discussions similaires

  1. Type de données pour identifiant ( clé primaire )
    Par mehdi_862000 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 14/04/2008, 12h30
  2. Types de données interbase
    Par Clotilde dans le forum InterBase
    Réponses: 2
    Dernier message: 18/11/2003, 14h10
  3. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  4. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 15h15

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