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 :

Mise en facteur de code


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut Mise en facteur de code
    Bonjour à tous

    Je voulais savoir si dans le cas que je vais vous exposer brièvement il serait possible de faire une factorisation de code qui serait utilisé dans 2 classes quasiment identiques.

    Je travaille sur 2 classes Matrix.
    La première classe est template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<unsigned int Lines, unsigned int Columns, typename T>
    class Matrix {...};
    Cette classe utilise std::array et m'est utile pour pas mal de choses.

    Cependant, j'ai eu besoin de faire une classe matrix sans paramètres template de taille, qui ne pouvaient être déterminés à la compilation. C'est pourquoi j'ai une seconde classe Matrix qui utilise non pas des std::array mais des std::vector.

    Ma question est donc la suivante : est-ce possible de mettre en facteur la quasi totalité du code des 2 classes (ce sont exactement les mêmes algo et types d'accès aux données) sachant que l'une des classes contient des paramètres template définis à la compilation et l'autre peut être ajustée à l'exécution ?

    Je précise que la deuxième classe pourrait être utilisée à la place de la première mais que la première apporte une sécurité d'utilisation

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Tu peux templatiser en fonction du type de conteneur.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Oui en effet je ne sais pas pourquoi je n'y ai pas pensé ^^

    Merci à toi je mets le sujet résolu dès que j'ai fini ce que je veux faire.

    J'ai encore un petit problème : je n'arrive pas à voir comment faire pour avoir un template qui puisse prendre en compte à la fois le std::vector, qui serait quelque chose du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <template <typename ... A> class Conteneur, typename ...Pack>
    Ou plus simplement dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <template <typename A> class Conteneur, typename A>
    Et le type std::array, qui serait quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <template <typename A, unsigned int B> class Conteneur, typename A, unsigned int B>
    Comment faire pour inclure des "template de valeurs" au milieu de "template de type" avec des template variadic (enfin pas forcément mais en tout cas sans avoir recours à une quelconque spécification qui serait synonyme de redondance dans le code)

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Étant sur Visual 2010, je n'ai pas encore eu l'occasion de travailler avec les templates variables. Je ne pourrai donc t'aider sur ce point.

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Pas forcément besoin de templates variadiques ici.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <class T>
    class Mat {
    	T data;
    };
     
    template <class T, unsigned int S>
    using SmallMat = Mat<std::array<T, S>>;
     
    template <class T>
    using BigMat = Mat<std::vector<T>>;
     
    SmallMat<int, 42> sm;
    BigMat<float> bm;

    edit : par contre, tu vas avoir un problème de constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T>
    class Mat {
    	// ...
    	Mat(unsigned int l, unsigned int c); // <- seulement dans le cas d'une matrice basée sur un vector
    	// sans spécialiser Mat, c'est impossible de le supprimer/ajouter quand il faut.
    };
    On peut surement s'en sortir avec un static_assert, mais pas persuadé que ce soit une solution "propre".

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    À propos du problème soulevé par Iradille, tu peux faire un trait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template <class T>
    struct is_dynamic;
     
    template<class T>
    struct is_dynamic<std::vector<T>>
    {
      static bool value = true;
    };
     
    template<class T, std::size_t c>
    struct is_dynamic<std::array<T, c>>
    {
      static bool value = false;
    }
    Ensuite tu actives le constructeurs seuleument pour les versions dynamiques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    class Mat {
    	// ...
            template<typename U = T, class = typename std::enable_if<is_dynamic<T>::value>::type>
    	Mat(unsigned int l, unsigned int c); // <- seulement dans le cas d'une matrice basée sur un vector
     
    };
    C'est une solution qui ne marche qu'en C++11 (voir la 2ème réponse ici).

    Sinon tu peux faire la même chose en utilisant une classe de base et puis en spécialisant.

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

Discussions similaires

  1. [ Microsoft Expression Web] Mise en place de code
    Par beletteroi dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 29/07/2007, 12h13
  2. mise en forme du code dans word
    Par minie dans le forum Word
    Réponses: 1
    Dernier message: 24/06/2007, 01h46
  3. Mise en forme de code C++
    Par mchk0123 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 08/04/2007, 18h05
  4. Mise en cache du code ?
    Par Jérem22 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 03/03/2007, 17h57

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