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 :

Un peu comme un template..


Sujet :

Langage C++

  1. #1
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut Un peu comme un template..
    bonjour,

    desole pour le titre un peu vague, mais je ne sais pas nommer ce que je cherche. je developpe une classe pour faire des calculs dans un corps fini (donc en gros modulo un entier p). j'ai donc créé une classe qui gere tout ca, mais du coup je dois repeter cet entier a chaque fois. par exemple, si je veux calculer modulo 7, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    element a(2,7)
    element b(6,7)
     
    cout << a+b << endl; //affiche 1
    du coup, si je veux coder des matrices, ou des vecteurs avec des elements de ce corps, je dois me trimballer le 7 de partout. je voulais savoir s'il y avat moyen, dans un souci de genricité, de faire un truc analoge aux templates, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    element<7> a(2)
    element<7> b(2)
    du coup, si je programme une classe matrice avec un template, je pourrais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    matrice<element<7>> m;
    et du coup, tous mes calculs sur les coefficients se feraient modulo 7 de facon transparente.. je ne sais pas si je suis clair !

  2. #2
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Chez moi, ce code

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <iostream>
     
    using namespace std;
     
     
    template <unsigned N>
    class Element
    {
    	unsigned       val;
     
    public:
    	Element(unsigned val_) : val(val_ % N)
    	{
    	}
     
    	Element& operator=(const Element& e)
    	{
    		val = e.val;
    		return *this;
    	}
     
    	Element operator+(const Element& e)
    	{
    		return Element((val + e.val) % N);
    	}
     
    	operator unsigned()
    	{
    		return val;
    	}
    };
     
     
    int main()
    {
    	Element<7> e1(3);
    	Element<7> e2(6);
     
    	cout << e1 << '\n' << e2 << '\n' << e1 + e2 << endl;
     
    	return 0;
    }
    Affiche

    3
    6
    2

    C'est ce qu'on voulait

    Et ceci ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Element<7> e1(1);
    Element<3> e2(2);
     
    e1 = e2;
    Par contre ce code compile ! Pourquoi ? A cause de l'operateur de conversion unsigned, faut l'enlever, ça peut créer des surprises comme ça vient de me le faire (et éventuellement le remplacer par un get() ou surcharge de operator<<) ; c'était juste pour simplifier l'affichage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Element<7> e1(1);
    Element<3> e2(2);
     
    cout << e1 + e2 << endl;

  3. #3
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    ok, merci bien !!

    par contre, je ne comprends pas bien pourquoi ton premier exemple plante, et pourquoi ton operator= retourne qqchose... en general chez moi c'est du void !

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par jobherzt
    ok, merci bien !!

    par contre, je ne comprends pas bien pourquoi ton premier exemple plante, et pourquoi ton operator= retourne qqchose... en general chez moi c'est du void !
    Pour faire a = b = c;
    Si tu retournes un void, ça ne peut pas marcher. operator= devrait retourner toujours une référence vers *this.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    NB: En général, on préfère écrire l'opérateur + comme une fonction libre, non amie, qui est définie en termes de +=.
    D'autant qu'ici le constructeur n'est pas explicite ce qui permet donc les convertions implicites. Avec un operateur + membre, on perd la symétrie sur l'opération.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Tu veux dire un truc comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <int N>
    Element<N> operator+(const Element<N>& a, const Element<N>& b)
    {
    	Element<N> c = a;
    	c += b;
    	return c;
    }
    Et pourquoi on perd en symétrie ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Au moins, ça réduit la tentation qu'on les programmeurs débutants (et les mauvais profs ) de faire des opérateurs + qui sont en réalité des +=...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    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
    Citation Envoyé par HanLee
    Et pourquoi on perd en symétrie ?
    Car si on a l'opéreteur + en fonction membre, un constructeur prenant un unsigned et pas d'opérateur de conversion vers unsigned :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned i = 42;
    Element<12> j = 7;
     
    j+i; // Ok, converti i en Element<12>, retourne un Element<12>
    i+j; // Ko, il n'y a pas de fonction qui convienne.
    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.

  9. #9
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <int N> 
    const Element<N> operator+(const Element<N>& a, const Element<N>& b) {  
       Element<N> c = a; c += b; return c; 
    }
    Pour éviter les surprises du genre :

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Simple curiosité sur la remarque de Patriach24.
    J'ai pas essayé d'écrire "a+b=7" avec mon compilo favori mais:
    -le type d'un retour par valeur n'est-il pas constant par défaut?
    -je pense que même sans le "const", le compilo devrait bloquer avec une erreur du genre "ne peux pas assigner à une variable temporaire"

    Perso j'ai encore jamais utilisé "const" pour les types de retours de fonctions (sauf à l'occasion pour les références et pointeurs bien sûr).
    Ca fait trop lourd comme syntaxe, et puis je crois que y'a pas grand monde qui écrirait "a+b=7".

    PS: à la réflexion, ça m'étonnerait que le type de retour soit constant par défaut.

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Charlemagne
    Simple curiosité sur la remarque de Patriach24.
    J'ai pas essayé d'écrire "a+b=7" avec mon compilo favori mais:
    -le type d'un retour par valeur n'est-il pas constant par défaut?
    -je pense que même sans le "const", le compilo devrait bloquer avec une erreur du genre "ne peux pas assigner une variable temporaire"

    Perso j'ai encore jamais utilisé "const" pour les types de retours de fonctions (sauf à l'occasion pour les références et pointeurs bien sûr).
    Ca fait trop lourd comme syntaxe, et puis je crois que y'a pas grand monde qui écrirait "a+b=7".

    PS: à la réflexion, ça m'étonnerait que le type de retour soit constant par défaut.
    Non, ce n'est pas constant par défaut. Par exemple, si le retour est un proxy vers une variable interne, il ne doit pas être constant et on doit pouvoir écrire a+b = 7.

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Miles
    Non, ce n'est pas constant par défaut. Par exemple, si le retour est un proxy vers une variable interne, il ne doit pas être constant et on doit pouvoir écrire a+b = 7.
    Ah oui, un proxy...
    Bref, ça ne parait quand même pas super judicieux d'autoriser "a+b=7".
    Je pense que le compilo bloquerait quand même à un moment ou à un autre, si l'opérateur renvoie une valeur (comme à l'accoutumée)

  13. #13
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    re-bonjour, juste une question pour confirmer que je me sui royalement planté de voie :

    quand on utilise un template comme je cherchais a le faire et comme vos conseils m'ont permis de le faire avec succes, il faut que mon entier soit defini a la compilation, i.e. je ne peux pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int p;
     
    cin >> p;
     
    element<p> machinTruc;
    ??

    (en fait, je m'en doutais un peu, mais comme j'ai vu des librairies d'algebre qui fonctionnait comme ca avec un passage en template de l'entier modulo, je pensais que c'etait possible.. du coup je ne sais pas comment ils font, eux )

    si c'est bien le cas, je vais devoir revoir ma strategie...

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Effectivement, c'est impossible, il faut connaître l'entier à la compilation, puisque c'est le compilateur qui va calculer.
    Les bibliothèques d'algèbre connaissent l'entier à la compilation.

Discussions similaires

  1. [AC-2003] Créer des rendez-vous périodiques un peu comme sous OutLook.
    Par User dans le forum Contribuez
    Réponses: 10
    Dernier message: 22/07/2015, 08h40
  2. Outil pour créer une app un peu comme le logiciel Qlick View
    Par hjoumane dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 07/11/2013, 13h12
  3. Réponses: 1
    Dernier message: 01/07/2008, 18h19
  4. Existe des outils de generation de doc automatique un peu comme javadoc mais pour C ?
    Par Gruik dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 29/06/2006, 10h48
  5. Cherche un objet un peu comme une TStringList
    Par Desraux dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2004, 14h04

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