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 :

Utilisation d'un template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut Utilisation d'un template
    Bonjour,
    J'aimerais avoir un peu d'aide sur l'utilisation de templates avec C++.

    J'utilise une bibliothèque (NT2) qui - en résumé - manipule des matrices avec un comportement et une syntaxe proche de MATLAB.
    Comme ces matrices peuvent manipuler des éléments de différents types (float, double, int, ...), un certain nombre de typedefs sont définis pour alléger la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef nt2::matrix<double,        nt2::settings<nt2::FORTRAN_policy> > M_d;
    typedef nt2::matrix<size_t,        nt2::settings<nt2::FORTRAN_policy> > M_t;
    typedef nt2::matrix<int,           nt2::settings<nt2::FORTRAN_policy> > M_i;
    typedef nt2::matrix<bool,          nt2::settings<nt2::FORTRAN_policy> > M_b;
    typedef nt2::matrix<unsigned char, nt2::settings<nt2::FORTRAN_policy> > M_uc;
    typedef nt2::matrix<char,          nt2::settings<nt2::FORTRAN_policy> > M_c;
    Pour info, nt2::settings<nt2::FORTRAN_policy> vise simplement à faire débuter la matrice à l'indice 1, donc comme en MATLAB.

    Le code suivant
    permet par exemple de déclarer une matrice de double.

    Mon problème est le suivant : j'aimerais pouvoir créer un type un peu plus générique que M_d, M_f, M_i etc... à la manière d'un std::vector<type>, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monTypeMatrice<double> maMatrice; // anciennement M_d maMatrice;
    monTypeMatrice<int> maMatrice; // anciennement M_i maMatrice;
    Est ce qu'une solution à mon problème existe, en utilisant notamment les templates ?

    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 116
    Billets dans le blog
    148
    Par défaut
    Ce que tu as montré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef nt2::matrix<double,        nt2::settings<nt2::FORTRAN_policy> > M_d;
    typedef nt2::matrix<size_t,        nt2::settings<nt2::FORTRAN_policy> > M_t;
    typedef nt2::matrix<int,           nt2::settings<nt2::FORTRAN_policy> > M_i;
    typedef nt2::matrix<bool,          nt2::settings<nt2::FORTRAN_policy> > M_b;
    typedef nt2::matrix<unsigned char, nt2::settings<nt2::FORTRAN_policy> > M_uc;
    typedef nt2::matrix<char,          nt2::settings<nt2::FORTRAN_policy> > M_c;
    C'est dans la matrice ?
    Car si c'est dans la matrice , qui ce dit C++ je ne vois pas pourquoi l'auteur n'aurait pas utlisé les template ... et si c'est de toi alors oui ce serait bien les templates ( enfin je crois ).

    Le principe du template c'est que chaque fonction qui utilise la donnée templatisé sois la même.
    Car si entre la matrix de double et la matrice de char , la fonction ( les calculs ) ne sont pas les mêmes on peut pas templatisé ( je pense que pour des matrix ce sont les même , à moins que le gars est fait des optimisations sur les bits ... )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Les typedefs que j'ai cités sont extérieurs à la bibliothèque et servent uniquement à alléger la syntaxe.

    En fait les matrices nt2::matrix fonctionnent sur le même principe que les std::vector.
    Si on veut une matrice remplie d'éléments "double" on tape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nt2::matrix<double> maMatrice;
    Le deuxième paramètre template est facultatif mais peut servir, comme je l'ai dit, à faire débuter les indices de matrices à 1 au lieu de 0. Comme mes matrices doivent débuter à 1, je dois préciser cette option en deuxième paramètre du template et cela alourdit considérablement ma syntaxe, d'où l'utilisation des typedefs cités plus haut.

    Ceci dit, je vient de voir sur la FAQ de developpez.com que le C++ ne permet pas pour l'instant de créer d'alias sur un template, ce qui semblait être la solution à mon problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<typename T> nt2::matrix<T, nt2::settings<nt2::FORTRAN_policy> > matriceGenerique_t;
    ...
    matriceGenerique_t<double> maMatrice; // au lieu de M_d maMatrice;
    La FAQ propose de contourner le problème sur les versions actuelles de C++ avec un struct, mais ... bouarf

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il me semble que certains compilateurs (gcc ?) implémentent déjà les templates aliases du C++0x, mais je n'en suis pas certain. Ce serait la solution la plus propre pour toi.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  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
    En attendant, tu peux faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template<typename T> 
    class matriceGenerique_t 
       : public nt2::matrix<T, nt2::settings<nt2::FORTRAN_policy> >  
    {};
     
    // Puis : 
    matriceGenerique_t<double> maMatrice;
    matriceGenerique_t<int> maMatrice2;
    ...
    Personnellement, je préfère quand même l'approche de la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <typename T>
    class matriceGenerique_t 
    {
    public:
        typedef nt2::matrix<T, nt2::settings<nt2::FORTRAN_policy> >  type;
    };
     
    // Puis
    matriceGenerique_t<double>::type maMatrice;
    matriceGenerique_t<int>::type maMatrice2;

  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
    Ce genre de manipulations est assez proche du template rebinding, mais plus en général de la programmation sur les types en C++, ce à propos de quoi tu pourras trouver des informations dans cet article.

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

Discussions similaires

  1. [MySQL] Récupérer valeur d'un select en utilisant systeme de template
    Par Blade dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/11/2008, 10h43
  2. Utilisation avancée des templates
    Par olivier2019 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 03/04/2008, 14h26
  3. utilisation d'une template css comme Master page
    Par phpieur dans le forum ASP.NET
    Réponses: 1
    Dernier message: 30/04/2007, 10h42
  4. [XSLT] utilisation d'un template ?
    Par ghohm dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 11/09/2006, 17h37
  5. Utilisation d'un template avec une map
    Par bonano dans le forum Langage
    Réponses: 6
    Dernier message: 09/08/2006, 21h26

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