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 et spécialisation.


Sujet :

C++

Vue hybride

NoIdea Templates et spécialisation. 18/12/2010, 11h56
NoIdea J'ai trouvé. Il me fallait... 18/12/2010, 13h05
koala01 Salut, A vrai dire, je ne... 18/12/2010, 13h18
Joel F Sur certain systèmes, c'est... 18/12/2010, 13h37
3DArchi Salut, Présentation des... 18/12/2010, 20h59
Alp @NoIdea: tu noteras que le... 18/12/2010, 21h32
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut Templates et spécialisation.
    Bonjour, j'essaie d'écrire une classe Matrix, et, je n'arrive pas à la spécialiser comme je veux. Voici à quoi ressemblerait ma classe Matrix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T, unsigned int Ligns, unsigned int Columns>
    class Matrix
    {
        private :
            T*Obj;
        public :
            /*DesChoses.*/
    };
    La difficulté :

    J'aimerais que quand sizeof(T)*Ligns*Columns < 8*1000*100 (100ko), que Obj soit un tableau statique.
    Donc déclaré ainsi : T Obj[Ligns*Columns].
    Mais que quand sizeof(T)*Ligns*Columns > 8*1000*100 (100ko) j'aimerais alloué dynamiquement Obj (pour éviter de trop remplir la pile).
    Donc, déclaré ainsi : T*Obj. En allouant avec new dans le constructeur.

    Bien sur, l'une des solutions aurait été de spécialiser selon un booléen que l'utilisateur choisirait en true ou false :

    Par Exemple :

    Matrix<float, 4,4,true>//On alloue sur la pile.
    Matrix<double, 1000,100,false>//On alloue sur le tas

    Sauf que je veux que l'utilisateur ne rentre pas le true/false tout en lui laissant l'option de le faire (si il veut vraiment alloué un mégaoctet sur le pile, il peut l'obliger).

    Il serait donc utilisé ainsi :

    Matrix<float, 4,4>//On alloue sur la pile.
    Matrix<double, 1000,100>//On alloue sur le tas.
    Matrix<float, 4,4,false>//On alloue sur le tas.
    Matrix<double, 1000,100,true>//On alloue sur la pile.

    Comment donc spécialiser ma classe ? Ou mettre mes templates par défauts ?
    Pensez vous que c'est une bonne idée de proposer pile/tas ? La limite de 100ko par défaut est-elle bonne ?

    Merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    J'ai trouvé. Il me fallait créer une autre structure et faire :

    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
    template<typename T, unsigned int Ligns, unsigned int Columns, bool size>
    struct Politique
    {
        typedef T* type;
    };
     
    template<typename T, unsigned int Ligns, unsigned int Columns>
    struct Politique<T,Ligns,Columns,true>
    {
        typedef T type[Ligns*Columns];
    };
     
    template<typename T, unsigned int Ligns, unsigned int Columns, bool policy=(sizeof(T)*Ligns*Columns<8*100*1000)>
    class Matrix
    {
        private :
            typename Politique<T,Ligns,Columns,policy>::type Obj;
    }

  3. #3
    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,

    A vrai dire, je ne suis pas forcément persuadé qu'il soit particulièrement intéressant de faire ce genre de distinction... Tu serais tout aussi bien d'utiliser directement l'allocation dynamique, quelle que soit la taille finale du tableau.

    De plus, je me méfie énormément des règles arbitraires, car on peut toujours décider de les remettre en compte: pourquoi 100 k et non 1000 ou 10

    Certaines implémentation de la STL permettent, il est vrai, de faire quelque chose du genre en créant un tableau statique lorsque la taille de la chaine n'est pas supérieure à la taille d'un registre (typiquement 32 ou 64 bits), mais ce genre de limite est plus facilement défendable
    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

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Sur certain systèmes, c'est intéressant de faire ce distingo. Par contre, il serait de meilleur aloi de fournir une politique qui permette de spécifier la règle plutot que d'avoir une limite arbitraire.

  5. #5
    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,
    Présentation des classes de Traits et de Politiques en C++ par Alp Mestan
    A consulter sans modération

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    @NoIdea: tu noteras que le dernier exemple de traits dans l'article donné par 3DArchi utilise quelque chose de très similaire à ce que tu fais, et qu'utiliser une petite structure utilitaire comme c'est fait dans l'article est assez commun, surtout quand les conditions de spécialisations ne sont pas tout à fait triviales.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Merci. Pour ces précisions, j'avais déjà lu l'article mais j'ai du l'oublier en grande partie. Le relire ne me fera pas de mal.

    Juste quelques questions :

    -La limite de 100ko est celle par défaut, bien sur, l'utilisateur peut spécifier si il veut allouer sur la pile/tas. Que pensez vous de cette limite par défaut ?

    -Les petites structures, on les met dans un espaces de nom anonyme habituellement ?

    -Pour des soucis de performances, j'ai créer une structure qui m'indique si le type est un type de base (pointeur/int/float/...). Ainsi, le me contente d'un memcpy pour copier la matrice. Est-ce chose courante ? Peut-on demander au compilateur si le contructeur du template est trivial ? (comme sa sa marcherait même pour des structures C).

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/09/2014, 16h37
  2. Pointeurs et références + template et spécialisation
    Par Lintel-oo dans le forum Langage
    Réponses: 23
    Dernier message: 29/06/2012, 14h40
  3. stockage de template sans spécialisation préalable
    Par antx31 dans le forum Langage
    Réponses: 5
    Dernier message: 22/11/2010, 08h41
  4. [Template] erreur spécialisation explicite
    Par Elstak dans le forum C++
    Réponses: 9
    Dernier message: 16/10/2008, 11h45
  5. Réponses: 4
    Dernier message: 15/10/2008, 09h33

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