Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
984 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Utilisez boost::operators<T>

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisez boost::operators<T>

n°779359
Taz
bisounours-codeur
Posté le 27-06-2004 à 00:04:09  profilanswer
 

http://boost.org/libs/utility/operators.htm
 
Ça n'est pas un truc de fénéants (quoi que), c'est surtout pour gagner du temps et éviter les erreurs de typos quand il s'agit d'implémenter les différents opérateurs pour une classe. Le principe d'orthogonalité fait qu'une fois qu'on a définit operator==, operator!= est défini comme la négation. Idem pour + qui est défini en fonction de +=. Etc. bref il y a foule d'opérateurs dont le code est trivial : on peut donc automatiser tout ça. Jeter un oeil à l'exemple rapide de boost.
 
Maintenant, au lieu d'utiliser bêtement un truc qu'on comprends pas, on va le faire nous même, le comprendre, et après basta.
 
Pour éviter de dupliquer du code, on va évidemment utiliser l'héritage. Seulement comment faire puisque on va définir une class A qui définit operator== et qui hérite de NotEqual qui lui définit operator!= ... au niveau des types, ça ne va pas coller, ce qu'il faut c'est que operator!= de NotEqual utilise bien operator== de A, sans virtualité, ni rien.
 
La même solution, déjà expliquée je ne sais plus où ici : « Barton and Nackman Trick » aussi nommée « Curiously Recursive Template Pattern »
 
Exemple :

Code :
  1. template<typename T>
  2. struct NotEqual
  3. {
  4.   bool operator!=(const T &rhs) const
  5.   {
  6.     return not (static_cast<const T&>(*this) == rhs);
  7.   }
  8. };
  9. template<typename T>
  10. struct PostIncrement
  11. {
  12.   friend T operator++(T &that, int)
  13.   {
  14.     const T old(that);
  15.     ++that;
  16.     return old;
  17.   }
  18. };
  19. class Lazy
  20.   : public NotEqual<Lazy>, PostIncrement<Lazy>
  21. {
  22. public:
  23.   bool operator==(const Lazy &rhs) const
  24.   {
  25.     return this == &rhs;
  26.   }
  27.   Lazy& operator++()
  28.   {
  29.     return *this;
  30.   }
  31. };
  32. int main()
  33. {
  34.   Lazy a, b;
  35.   a != a;
  36.   a != b;
  37.   a++;
  38.   ++a;
  39. }


 
note : 2 technique, fonction membre ou fonction friend, la deuxième technique permet l'héritage privé. Le code de Lazy est sans intérêt et n'est là que pour l'exemple
 
Merci les templates et les références.

mood
Publicité
Posté le 27-06-2004 à 00:04:09  profilanswer
 

n°779411
blackgodde​ss
vive le troll !
Posté le 27-06-2004 à 01:46:21  profilanswer
 

static_cast<const T&> (dans NotEqual) static parce que le downcast est résolu à la compilation c'est ca ?


---------------
-( BlackGoddess )-
n°779414
Taz
bisounours-codeur
Posté le 27-06-2004 à 01:48:41  profilanswer
 

oui et surtout pour lui dire quoi utilisé, sinon il trouvera jamais operator==(NotEqual<Lazy>, Lazy)

n°779415
blackgodde​ss
vive le troll !
Posté le 27-06-2004 à 01:51:20  profilanswer
 

bien, merci pour cet article :)


---------------
-( BlackGoddess )-
n°779442
Evadream -​jbd-
Posté le 27-06-2004 à 03:36:04  profilanswer
 

J'avais bricolé un truc pour arriver au même résultat, mais c'était vraiment du bricolage, là c'est clairement mieux :) Merci !

n°779456
Taz
bisounours-codeur
Posté le 27-06-2004 à 09:15:12  profilanswer
 

le but final, c'est de s'autoriser à utiliser boost.

n°779529
Evadream -​jbd-
Posté le 27-06-2004 à 13:37:16  profilanswer
 

Bien sur, mais si on a malheureusement pas boost disponible, c'est oujours pratique !

n°779532
Taz
bisounours-codeur
Posté le 27-06-2004 à 13:41:34  profilanswer
 

ben tu te le fournis : faut pas déconner, y a un moment faut se donner les moyens de travailler. Alors c'est pas une excuse le « ouin, c'est pas disponible », c'est un produit open-source, ça s'installe comme autre chose. Et la partie template pure de boost ne demande rien d'autre qu'un dézippage.

n°779551
nraynaud
lol
Posté le 27-06-2004 à 13:58:46  profilanswer
 

on verra ça dans le train


---------------
trainoo.com, c'est fini
n°779557
Taz
bisounours-codeur
Posté le 27-06-2004 à 14:05:51  profilanswer
 

oui ?

mood
Publicité
Posté le 27-06-2004 à 14:05:51  profilanswer
 

n°779563
Evadream -​jbd-
Posté le 27-06-2004 à 14:12:17  profilanswer
 

Je suis absolument d'accord. Mais des fois, tu peux tomber sur des profs qui comprennent pas la nécessité d'installer des bibliothèques externes parce qu'ils l'ont jamais fait (et donc n'en voit pas l'utilité), ou bien qui enseigne un langage depuis 20 ans et ne concoivent pas que celui-ci peut évoluer.
 
 
[3615 mylife]
 
Je te donne le triste exemple d'un projet (un proxy web en C). La soutenance devait se tenir dans une salle avec une distrib "récente", gcc 3.3 etc.. Je me dis chouette, je vais pour compiler en std=c99 et déclarer mes variables à n'importe quel endroit.
 
Manque de pot, jour de la soutenance, on change de salle, gcc 2.96, glibc 2.1. On explique le soucis au prof, qui ne veut rien savoir, "çà marche pour tout le monde, pourquoi pas vous ? Vous devez avoir des erreurs dans votre code". Oui, je sais, c'est grave, mais c'est tombé sur nous ce jour là. On a compiler sur une machine avec gcc 3.3 via ssh, et lancé un browser de cette même machine via ssh -X. Ca ramait sevère, le prof comprenait rien. Il nous as dit : "Je vous fait passer en dernier à la soutenance, arrangez moi çà, je veux que ca compile ici et chez moi sans problèmes".
 
Que veux-tu dire à çà ? C'est lui le prof, c'est lui qui met la note. Bien sur je suis allé me plaindre (pas contre le prof, pas fou :D) sur la vetusté logiciel des machines etc...
 
Tout çà pour dire que c'est pas ce genre d'individus qui va installer boost pour que ton programme compile.
 
[/3615 mylife]
 


Message édité par Evadream -jbd- le 27-06-2004 à 14:15:49
n°779568
Taz
bisounours-codeur
Posté le 27-06-2004 à 14:19:45  profilanswer
 

j'ai déjà vécu ça. en 15minutes, le temps de modifier pour que ça fonctionne avec un gcc-2.95 buggé (bugs énorme au niveau des vtable), je suis passé de 0 à 19
 
mais bon, faut avoir un peu plus d'ambition que de faire des programmes pour des profs qui n'ont jamais programmé de leur vie.

n°779575
Evadream -​jbd-
Posté le 27-06-2004 à 14:25:24  profilanswer
 

T'inquiètes pas pour çà !
Tout ca pour dire que je range ton exemple dans ma TazToolbox ;)
 
@++

n°779761
nraynaud
lol
Posté le 27-06-2004 à 21:27:00  profilanswer
 

mouais. bon. je m'en relèverais pas la nuit.


---------------
trainoo.com, c'est fini
n°779764
Taz
bisounours-codeur
Posté le 27-06-2004 à 21:31:04  profilanswer
 

à moins d'en faire un cauchemard. j'ai pas la prétention de soumettre quoique ce soit d'inédit, juste de faire découvrir un petit truc. Le but c'est pas que tout le monde puisse écrire ça, juste que ça soit à peu près compréhensible pour se décomplexer d'utiliser boost, et faire sauter la couche magique qui peut entourer certains bidules template. Bref, je suis satisfait


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Utilisez boost::operators<T>

 

Sujets relatifs
Qu'utilisez-vous comme icônes pour vos applications ?Install de BOOST (boost_has_long_long)
utilisez des parametres avec la commande "acCmdLinkTables" ?[ide python] quel editeur utilisez vous ?
Utilisez vous les classes ??Quelle base de donnée utilisez-vous principalement ?
BOOST, ça vaut le coup ?[C++] boost::filesystem > Chemins relatifs
Quelle bibliothèque FTP pour JAVA utilisez-vous ?[ Eclipse ] Listez ici les plugin que vous utilisez
Plus de sujets relatifs à : Utilisez boost::operators<T>


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR