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 :

template, polymorphisme et génération de type


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut template, polymorphisme et génération de type
    Bonjour,

    Pas de solution a priori dans le reste du forum. Pourtant ce que je souhaite faire me parait quelque chose de basique :

    Objectif : créer un tableau de type choisi par l'utilisateur.

    Idée de base :
    _1) le template ... ca marche mais il faut préciser le type au moment de la création.
    _2)une classe contenant un pointeur void* ... pour le polymorphisme.
    Pb : comment donner l'argument dans le constructeur??
    Je pourrais faire un mappage mais je serais limité à ma connaissance et ce n'est pas très intuitif. Le typeid ne connait que le nom du type mais le type est caché! Alors que faire?

    Avez-vous une solution simple?

    Merci d'avance et bon noël!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Bonjour,

    Citation Envoyé par DEVfan
    Objectif : créer un tableau de type choisi par l'utilisateur.
    C'est assez léger comme objectif.
    Voici des solutions presques aléatoires pour y répondre, mais qui ne seront pas forcément adapté à ce que tu veux en faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const int taille = 12; void * tab[taille];
    std::vector<void *> tab;
    std::vector<boost::any> tab;
    boost::ptr_vector<TypeDeBase> tab;
    Il y a plusieurs questions pour tenter de préciser ton objectif :
    - La taille du tableau est elle fixe ?
    - Quand la taille du tableau est-elle connue ?
    - Les objets contenus par le tableau sont ils tous du même type ?
    - Quand connait-on le type de chaque élément du tableau ?
    - Est-ce que le tableau doit gérer la durée de vie des objets qu'il contient ?
    - ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    "C'est assez léger comme objectif."
    ->oui je sais c'est pour ça que je m'étonne de n'avoir rien trouvé.

    "const int taille = 12; void * tab[taille]; std::vector<void *> tab; std::vector<boost::any> tab; boost::ptr_vector<TypeDeBase> tab;"
    ->Oui ok mais le type est figé une fois le type donné.


    "Il y a plusieurs questions pour tenter de préciser ton objectif :
    - La taille du tableau est elle fixe ?
    - Quand la taille du tableau est-elle connue ?
    - Les objets contenus par le tableau sont ils tous du même type ?
    - Quand connait-on le type de chaque élément du tableau ?
    - Est-ce que le tableau doit gérer la durée de vie des objets qu'il contient ?"

    ->La taille du tableau est dynamique : connu lors de la construction ou d'un rezise
    ->Oui, les objets sont tous du même type.
    ->le type est connu lors de la construction et peut-être changé lors d'un équivalent resize.
    ->comprends pas la dernière question.

    Redéfinition de l'objectif :
    créer un tableau de type choisi par l'utilisateur, manipulé par la suite sans s'en préoccuper, mais de type modifiable.

    ex :
    Création d'un tableau d'int 4, 4 :
    _mon_tableau *ptr=new mon_tableau(int,4,4); ->peut pas faire, j'peux pas passer un type. Pourtant c'est ce que je voudrais faire.
    _mon_tableau<int> *ptr2=new mon_tableau<int>(4,4) -> faisable mais pas ce que je veux.

    ...Par la suite, mon_tableau *ptr3=new mon_tableau(typeid(ptr),n,n);

    Que dire?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut
    "...Par la suite, mon_tableau *ptr3=new mon_tableau(typeid(ptr),n,n);"

    Oui, d'accord, mais après ? tu veut faire quoi du contenu ?
    ça sert à quoi ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par DEVfan
    ->Oui ok mais le type est figé une fois le type donné.
    void* et boost::any, c'est pas trop ce que j'appelle figé comme type. M'enfin ...

    Citation Envoyé par Syrmonsieur
    Oui, d'accord, mais après ? tu veut faire quoi du contenu ?
    ça sert à quoi ?
    Je plussoie les questions
    D'aileurs tu compte le remplir comment ton tableau ?
    Qu'est-ce qui t'empèche de le remplir avec un type pas accepté par ce tableau ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    Je commence à explorer la STL mais alors le boost... j'connais pas trop!

    Mais le pb n'est pas là. Si c'est comme un void*, on peut donner le type qu'on veut. Cependant on ne peut le faire qu'en direct :
    _void* bidule; ... bidule=new int[5]; (par exemple...bidon)... c'est du code brut quoi!

    Ce que je voudrais, c'est pouvoir faire :
    _Maclasse *bidule; ... bidule=new Maclasse(type,...); ... c'est du code aussi mais le type étant un paramètre, un utilisateur du programme pourrait créer n'importe quel objet. Dans un premier temps, à partir de type connu (int, double, char, etc.). Dans un deuxième temps, à partir d'une classe qui liste des objets précédents.

    Pour mathématiser :
    _n types de base connu
    +
    _1 classe générique d'un type paramétré
    +
    _1 classe de construction par aggrégation (ou liste)
    =>1 infinité de type.
    (C'est l'idée d'un template sans être obligé de définir l'objet)

    suis-je assez clair?
    Merci d'avance.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut
    En effet c'est problèmatique. Il faut lier le temps de compilation avec le temps d'execution.

    Si le nombre de choix de type est fini, tu peut faire un template, l'instancier explicitement pour chacun des choix et faire une map entre, par exemple, le nom du type choisi et une fonction paramétrée par le type qui gerera la création, le remplissage et la gestion du tableau.
    L'avantage est que tu conserve l'information de type.
    En revanche tu génère beaucoup de code, et sans doute pour rien.
    Enfin, c'est quand même très crade.

    Regarde le code de boost. smart_cast pourra peut-être t'aider. Ce fichier est utilisé par boost::serialization et boost::archive, fais y aussi un tour (attention aux migraines)

    Pour moins se prendre la tête, tu peut prendre une solution plus runtime et imposer que le type soit dérivé d'une classe de base polymorphique. Mais si j'ai bien compris ta question, ton but est de stocker un type quelconque...

    Enfin est-ce que tu en as vraiment besoin ? pourquoi veut tu faire ça ?

Discussions similaires

  1. [Template] Changer la génération des getter/setter
    Par anthyme dans le forum NetBeans
    Réponses: 2
    Dernier message: 05/07/2007, 09h26
  2. [XPath] Apply-templates sur des balises de type pwet:test
    Par BiM dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/09/2006, 15h17
  3. Fonction template recursive, avec imbrication de types
    Par YéTeeh dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 17h02
  4. Réponses: 8
    Dernier message: 28/03/2006, 15h53
  5. Réponses: 10
    Dernier message: 27/04/2005, 11h26

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