[défi de la semaine] objectif réutilisation maximale

objectif réutilisation maximale [défi de la semaine] - C++ - Programmation

Marsh Posté le 08-12-2003 à 23:00:47    

on va pas discuter de l'intéret de la réutilisation ... mais on va la mettre en pratique.
Mise en situation : vous avez votre type MyType et std::map<std::string, MyType*> alias ReferenceMap. Tout marche très bien, vous avez écrit des algorithmes fonctionnels. Maintenant, vous éprouvez le besoin d'utiliser des std::map<std::string, MyType> ou ContainerMap. Le problème est donc d'arriver à cela avec le minimum de travail.
Donc ce soir votre défi est simple à comprendre, très astucieux à mettre ne place
 

Code :
  1. #include <iostream>
  2. #include <map>
  3. #include <string>


quelques include nécessaires.
 
 

Code :
  1. class MyType
  2. {
  3. public:
  4.   void foo()
  5.   {
  6.     std::cout << "I am " << this << '\n';
  7.   }
  8. };


est votre type de base
 

Code :
  1. typedef std::map<std::string, MyType> ContainerMap;
  2. typedef std::map<std::string, MyType*> ReferenceMap;


vos conteneurs. pas touche aux typedef
 

Code :
  1. template<typename Map>
  2. void doSomething(Map &m)
  3. {
  4.   MyType t, *p(&t);
  5.   t.foo();
  6.   p->foo();
  7.   m["Test"]->foo();
  8.   typename Map::iterator i(m.find("Test" ));
  9.   i->second->foo();
  10. }


votre algorithme, c'est le seul morceau de code que vous n'avez pas le droit de modifier.
 

Code :
  1. int main()
  2. {
  3.   ContainerMap a;
  4.   ReferenceMap b;
  5.   a["Test"] = MyType();
  6.   b["Test"] = new MyType();
  7.   doSomething(a);
  8.   doSomething(b);
  9.   delete b["Test"];
  10.   b["Test"] = 0;
  11. }

votre main de test
 
 
vous pouvez tout modifier sauf la fonction doSomething et les typdefs.
 
bien entendu, tout n'est pas possible, une valeur et un pointeur sont incompatibles, ici, le travail c'est d'arriver à creer une interface pour permettre des manipulations similaires (je demande pas plus que ce qui est faisable dans la fonction)
 
si vous avez des questions, je suis là.


Message édité par Taz le 08-12-2003 à 23:53:38
Reply

Marsh Posté le 08-12-2003 à 23:00:47   

Reply

Marsh Posté le 08-12-2003 à 23:57:51    

Code :
  1. class MyType 
  2. {
  3. public:
  4.    void foo()
  5.    {
  6.       std::cout << "I am " << this << '\n';
  7.    }
  8.      
  9.    MyType* operator->() { return this;}
  10. };


 
j'ai bon?  [:cupra]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 09-12-2003 à 00:01:24    

bah commme je dis à ffluff qui a vite converger vers là : c'est le principe de la solution (et la version const bordel :o), après y a l'art et la manière de le faire, j'entends par là quelque chose de beau en template.

Reply

Marsh Posté le 09-12-2003 à 00:04:48    

maintenant faut la façon joulie et TAZ compilant [:ffluff]


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 09-12-2003 à 00:05:43    

je suis pas la pour faire du beau, mais pour torcher ton défi en 30s, bonne nuit [:ohello]


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 09-12-2003 à 00:05:58    

et un bon point à celui qui trouve un titre adéquate à la classe

Reply

Marsh Posté le 09-12-2003 à 00:07:21    

Code :
  1. class MyType 
  2.   {
  3.     public:
  4.       void foo()
  5.       {
  6.           std::cout << "I am " << this << '\n';
  7.       }
  8.       MyType* operator ->() {
  9.         return this;
  10.       }
  11.   };

je pense pas que c'est ce que Taz voulait mais j'ai trouvé la doc de operator -> plus vite que celle des opérateurs de casting.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 09-12-2003 à 00:20:20    

alors, le template svp

Reply

Marsh Posté le 09-12-2003 à 00:32:53    

honnêtement, je fais pas des exos pour vous. Cette fois-ci c'est plus facile, et hop ça roule des mécaniques, "J'ai la solution !". le but c'est de faire réfléchir les autres, leur apprendre des trucs, leur montrer des possiblités, leur donner le goût. là avec vos réponses, le mec il lit ma question, et direct le morceau de code, il cherche pas à comprendre. <Résolu>
c'était moins glorieux quand je demandais la définition d'un tableau. si vous voulez du boulot, moi je vous propose au choix : switch template ou alors carrément un mini-LISP. y a moyen de trouver beaucoup plus compliqué. je veux faire des sujets d'apprentissage, pas des démos rodéos.
 
conclusion :
utilité de ce sujet ~= 0

Reply

Marsh Posté le 09-12-2003 à 00:39:46    

Taz a écrit :

honnêtement, je fais pas des exos pour vous. Cette fois-ci c'est plus facile, et hop ça roule des mécaniques, "J'ai la solution !". le but c'est de faire réfléchir les autres, leur apprendre des trucs, leur montrer des possiblités, leur donner le goût. là avec vos réponses, le mec il lit ma question, et direct le morceau de code, il cherche pas à comprendre. <Résolu>
c'était moins glorieux quand je demandais la définition d'un tableau. si vous voulez du boulot, moi je vous propose au choix : switch template ou alors carrément un mini-LISP. y a moyen de trouver beaucoup plus compliqué. je veux faire des sujets d'apprentissage, pas des démos rodéos.
 
conclusion :
utilité de ce sujet ~= 0


bah non l'utilité y est pour ceux qui on envies de réfléchir.
Les faignants attendront de le lire la soluce. Et les autres qu'il y ai la soluce ou pas ils chercheront.
Mais c'est vrai que ceux qui sont entre les 2 ca leurs donne pas envies de chercher.


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
Reply

Marsh Posté le 09-12-2003 à 00:39:46   

Reply

Marsh Posté le 09-12-2003 à 00:48:23    

Fanchement, je préfère réfléchir à des trucs intelligents qu'à des problèmes purement techniques de langage.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 09-12-2003 à 00:50:33    

nraynaud a écrit :

Fanchement, je préfère réfléchir à des trucs intelligents qu'à des problèmes purement techniques de langage.

certes. la solution C++ est assez facile, mais la technique template amène une petite réflexion.

Reply

Marsh Posté le 09-12-2003 à 09:03:44    

j'y connais rien en C++ pour faire ça [:sisicaivrai]

Reply

Marsh Posté le 09-12-2003 à 16:37:37    

(je réfléchis, mais je trouve pas, comme le dernier ...)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-12-2003 à 17:41:03    

j'essaie de faire un template comme classe mere de MyType avec deduction du type du fils (MyType ici) mais j'y arrive pas, qq1 peut me dire de suite si je fais fausse route ? :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-12-2003 à 18:34:53    

non, c'est l'idée

Reply

Marsh Posté le 09-12-2003 à 18:53:23    

je m'y replonge alors :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-12-2003 à 19:25:09    

je ne suis arrivé qu'à faire ca :
 

Code :
  1. class MyType;
  2.   template<typename T>
  3.   struct Accesseur
  4.   {
  5.   const T* const operator ->() const {
  6.  return static_cast<const T* const>(this);
  7.       }
  8.   T* const operator ->() {
  9.  return static_cast<T* const>(this);
  10.       }
  11.   };
  12.   class MyType : public Accesseur<MyType>
  13.   {
  14.   ...


 
pour la déduction du paramètre template j'y arrive toujours pas :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-12-2003 à 19:26:31    

benco ! sauf les const qui foirent
Accesseur bof, je préfère "HereAndThere" :D

Reply

Marsh Posté le 09-12-2003 à 19:27:24    

Code :
  1. template<typename T>
  2. struct HereAndThere
  3. {
  4.   T* operator->()
  5.   {
  6.     return static_cast<T*>(this);
  7.   }
  8.   const T* operator->() const
  9.   {
  10.     return static_cast<const T*>(this);
  11.   }
  12. };

Reply

Marsh Posté le 09-12-2003 à 20:26:49    

ah, ya pas de déduction possible ?? bin je pouvais tjs chercher :p
 
n'empeche ... ya qq mois je comprenais pas un mot sur 2 de ce que Taz disait, maintenant j'arrive parfois a trouver des solutions :) je vais relire les tut tiens, j'avais abandonné j'y comprenais rien :) en tout cas merci, c grace a l'aide, et aux articles (et exercices) trouvés ici que j'ai progressé, merci :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-12-2003 à 21:59:10    


Salut a tous ..  
 
Je viens d'arriver dans le coin prog et ca me parait prometteur.  
 
BlackGoddess .. quand tu parles de tuts, il y en a sur HFR ?

Reply

Marsh Posté le 15-12-2003 à 00:56:42    

Taz et JoelF en avaient écrit oui:
http://forum.hardware.fr/forum2.ph [...] subcat=386


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 16-12-2003 à 13:15:08    

plus de défi cette semaine ? [:sisicaivrai]


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-12-2003 à 12:43:30    

non, mais on va enrichir votre culture générale.
Le véritable truc marrant ici, c'est le motif CRTP (Curiously Reccurring Template Pattern) (je crois que Coplien qui le premier a joué avec).
 
Dans notre programme, il apparait sous cette forme
 

Code :
  1. class MyType : public Accesseur<MyType>


 
Plus formellement, ce motif de conception est défini comme suit
 

Code :
  1. template<typename Derive>
  2. class BaseCurieuse
  3. {
  4.   // ...
  5. };
  6. class Curieux
  7.   : public BaseCurieuse<Curieux>
  8. {
  9.   // ...
  10. };
  11. // encore plus template
  12. template<typename T>
  13. class TemplateCurieux
  14.   : public BaseCurieuse < TemplateCurieux<T> >
  15. {
  16.   // ...
  17. };


 
 
d'ailleurs, si on utilise que la dernière forme, on eput carrément écrire
 
 

Code :
  1. emplate< template <typename> class Derive >
  2. class BaseTresCurieuse
  3. {
  4.   // ...
  5. };
  6. template<typename T>
  7. class TresCurieux
  8.   : public BaseTresCurieuse<TresCurieux>
  9. {
  10.   // ...
  11. };


 
 
Alors à quoi tout ça sert-il ? À plein de petites choses que l'on peut faire sans refonte massive. Comme dans notre exemple.
 
Allez, c'est Noël !
 

Code :
  1. #include <cstddef>
  2. template<typename T>
  3. class Compteur
  4. {
  5.   static size_t compte;
  6. protected:
  7.   Compteur()
  8.   {
  9.     ++compte;
  10.   }
  11.   Compteur(const Compteur &other)
  12.   {
  13.     ++compte;
  14.   }
  15.   ~Compteur()
  16.   {
  17.     --compte;
  18.   }
  19. public:
  20.   static size_t Compte()
  21.   {
  22.     return compte;
  23.   }
  24. };
  25. template<typename T>
  26. size_t Compteur<T>::compte = 0;
  27. #include <iostream>
  28. struct Chaussure
  29.   : public Compteur<Chaussure>
  30. { };
  31. int main()
  32. {
  33.   Chaussure droite, gauche;
  34.   std::cout << "J'ai mis mes "
  35.     << Chaussure::Compte()
  36.     << " chaussures au pied du sapin\n";
  37. }

Reply

Marsh Posté le 20-12-2003 à 15:12:12    

Faut vraiment que je trouve un bouquin genre C++ pour les nuls ...
Je suis sûr de passer à coté de beaucoup de choses intéressantes avec les templates & co ...
Ou bien suis peut-être trop vieux ;-(

Reply

Marsh Posté le 20-12-2003 à 15:21:24    

Cricri_ a écrit :

un bouquin genre C++ pour les nuls ...

c'est le livre qui est nul, pas les gens

Reply

Marsh Posté le 20-12-2003 à 19:14:05    

vi, enfin je citai ça pour dire ...
Perso j'ai appris le c grace à un petit stage d'une semaine, c'est très short, maintenant je programme par plaisir, je me suis mis un peu au C++ y a pas bien logtemps, et j'ai eu un peu de mal à mon age ;-) mais je ne le regrette pas, j'aurai dû mal à revenir au c.
Maintenant j'estime "faire" du C++ à 10% quand je lis ça et les "tutoriaux" que tu as fait avec Joël je crois ...
J'ai encore énormément à apprendre et certaines parties comme les templates, les exceptions, les cast static, dynamiques, ...
Et bien j'ai beaucoup de mal ...
Mais bon, j'arrête là, j'irai à mon rythme :)

Reply

Marsh Posté le 26-12-2003 à 11:39:19    

comment personne a sourit à ma blague pourrie

Reply

Marsh Posté le 26-12-2003 à 15:13:18    

:o   :pt1cable:

Reply

Marsh Posté le 01-01-2004 à 02:13:28    

Bonsoir,
 
Ah! C'etait une blague :p
 
Ca fait un bon moment que je programme en objet sous C/C++ voire un peu sous Java. Cela dit, je ne comprends quasiment rien à tes programmes Taz. Ce genre de programmation s'appuie me semble-t-il sur des ecritures et concepts du C++ assez subtiles (c'est peu de le dire)
 
Par pure curiosité intellectuelle, j'apprécie beaucoup ce post ;)
 
Au passage, c'est surement pas dans le "C++ pour les boulays" qu'on trouve ce genre de programmation, si oui je me prive de dessert pendant 2 jours.
 
Cordialement,
   Xter.


Message édité par xterminhate le 01-01-2004 à 02:16:13
Reply

Marsh Posté le 01-01-2004 à 16:13:24    

1) c'est pas subtile, c'est le C++. sinon c'est le C
2) le C++ pour les boolays, c'est du C
3) ne pas profiter de toutes les fonctionnalités du C++ c'est se pénaliser soi-même

Reply

Marsh Posté le 01-01-2004 à 18:57:13    

taz,
 
   Je modèrerais tes propos, car on ne doit pas avoir la même définition du C++ et surtout de la programmation objet en général. Bien que nos divergences n'ont aucune réelle importance, je me permets de me justifier.
 
   Mon avis est que le C++ offre la possibilité de faire de la programmation orientée objet (comme beaucoup d'autres langages par exemple java, il y en a bcp d'autres évidement), et tout cela, sans nécessairement installer la fameuse librairie STL. Quant au ré-use, STL n'est certainement pas indispensable, la POO définit les concepts de base qui sont directement applicables à l'aide d'un simple compilateur C++.
 
   Cela dit, STL apporte des éléments et surtout un mode de programmation permetant d'aller plus loin dans la POO et d'ecrire du code C++ d'une manière plus séduisante (sans aucun doute à ce que je vois et cela m'interesse beaucoup).  
 
   Enfin, j'ai tout à apprendre concernant la STL, mais il ne faut tout de même pas "dépendre" de cette librairie pour pouvoir faire de la POO.
 
Cordialement,
   Xter.
 
-edit-
PS: Bon ok, ok, je me prive de dessert jusqu'au WE. De toute manière faut que j'arrete, j'ai trop mangé avec ces fêtes  :pt1cable: ++


Message édité par xterminhate le 01-01-2004 à 18:59:53
Reply

Marsh Posté le 01-01-2004 à 18:58:33    

si tu vires la couche objet du C++ il reste vraiment plus grand chose.
je crois que tu manques un peu d'expérience

Reply

Marsh Posté le 01-01-2004 à 19:01:33    

La couche objet de C++ n'est pas la librairie STL... comprend pas ce que tu veux dire... :(
 
 
Xter.

Reply

Marsh Posté le 01-01-2004 à 19:05:16    

j'ai dit que STl était un très bon exemple de vrai C++

Reply

Marsh Posté le 01-01-2004 à 19:08:09    

Exact, je suis tout a fait d'accord !
 
Xter.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed