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 :

Templates : Instancier un type générique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 36
    Points
    36
    Par défaut Templates : Instancier un type générique
    Bonjour,

    Je cherche à instancier un type générique de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class T>
    void function(){
        T *t = new T();
    }
    Est-ce possible ? Je souhaiterais mettre en place ce mécanisme de manière récursive, c'est-à-dire que T peut être la classe générique elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <class T>
    class Tab{
        void function();
    };
     
    void Tab<class T>::function(){
        T *t = new T();
    }
     
    Tab<Tab<int>> *t = new Tab<Tab<int>>();
    J'ai certains problèmes à mettre ça en place.

    Merci d'avance.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    La syntaxe n'est pas bonne.
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    void Tab<T>::function()
    {
        T *t = new T();
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 36
    Points
    36
    Par défaut
    Merci !

    Et est-ce possible d'instancier le type avec un autre constructeur que celui par défaut ?

    La réponse semble être oui.

    Maintenant j'ai un autre souci. Ma classe template est Tab qui permet de déclarer un tableau. J'ai un souci lorsque je veux avoir des pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tab<Tab<int>> tab1;
    Tab<Tab<int>*> *tab2;
    Lorsque j'ai la deuxième forme, l'instanciation ne fonctionne plus car le new T() se transforme en new Tab<int>*(), et j'ai un problème à la compil. Mais cela m'intéresserait vraiment d'utiliser des pointeurs. Comment faire ? Y'a-t-il un moyen d'identifier que le type générique est en fait un pointeur ?

    Merci encore!

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    D'abord, je voudrais t'inciter à réfléchir sereinement à la nécessité réelle de manipuler des pointeurs.

    S'il y a, effectivement, des cas dans lesquels il n'y a pas vraiment d'autre solution, il faut savoir qu'il est largement préférable de les éviter autant possible si rien ne nous oblige à les utiliser (entre autres, si on ne souhaite pas manipuler des objet polymorphes en profitant justement de leur capacité polymorphique )

    Ceci dit, il est tout à fait possible d'envisager une spécialisation partielle de ta classe afin de prévoir des comportement selon que tu manipule des objets ou des pointeurs:
    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
    /* le comportement par défaut: on manipule des objets :D */
    template <typename T>
    class Tab
    {
        /*...*/
    };
    /* la même classe, spécialisée pour manipuler des pointeurs...
     * même si on ne sait pas quel type nous manipulons: c'est une
     * "spécialisation partielle" :D
     */
    template <typename T>
    class Tab<T*>
    {
        /*...*/
        // ATTENTION, il s'agira de t'assurer que les différents comportements
        // seront REELLEMENT adaptés à l'utilisation de pointeurs :D
    };
    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
    Nouveau membre du Club
    Inscrit en
    Août 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 36
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup koala01, c'est exactement ce qu'il me fallait. Je savais qu'on pouvait spécialiser avec des types particuliers, int, char, etc, mais pas avec des pointeurs. Cela donne à peu près ceci pour moi, si jamais quelqu'un a besoin de faire la même chose :

    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
    24
    25
    26
    27
    template <typename MonType>
    class Tab
    {
    public:
    	Tab(int size);
    	MonType operator[](int pos) const;
    	MonType& operator[](int pos);
    };
     
    template <typename MonType>
    class Tab<MonType*>
    {
    public:
    	Tab(int size);
    	MonType* operator[](int pos) const;
    	MonType*& operator[](int pos);
    };
     
    template <typename MonType>
    MonType Vecteur<MonType>::operator[](int pos) const{
    	return ...;
    }
     
    template <typename MonType>
    MonType* Vecteur<MonType*>::operator[](int pos) const{
    	return ...;
    }
    Merci encore pour votre aide !

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Et quelle différence entre tes 2 spécialisations ? Perso, je n'en vois aucune.

    (L'idée derrière ma remarque est que tu as peut être besoin de classes traits à un moment et pas forcément d'une spécialisation car pour au vu de la déclaration ta spécialisation n'en est pas une).

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

Discussions similaires

  1. Instanciation d'un tableau d'éléments de type générique
    Par collect dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 15/12/2013, 07h55
  2. Réponses: 5
    Dernier message: 20/08/2011, 07h32
  3. Réponses: 2
    Dernier message: 02/05/2011, 21h58
  4. [template] Instanciation d'une liste de types pour un plugin
    Par Matthieu Brucher dans le forum C++
    Réponses: 6
    Dernier message: 11/01/2007, 07h54
  5. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 18h23

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