Utilisez boost::operators<T>

Utilisez boost::operators<T> - C++ - Programmation

Marsh Posté le 27-06-2004 à 00:04:09    

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.

Reply

Marsh Posté le 27-06-2004 à 00:04:09   

Reply

Marsh Posté le 27-06-2004 à 01:46:21    

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


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

Marsh Posté le 27-06-2004 à 01:48:41    

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

Reply

Marsh Posté le 27-06-2004 à 01:51:20    

bien, merci pour cet article :)


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

Marsh Posté le 27-06-2004 à 03:36:04    

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

Reply

Marsh Posté le 27-06-2004 à 09:15:12    

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

Reply

Marsh Posté le 27-06-2004 à 13:37:16    

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

Reply

Marsh Posté le 27-06-2004 à 13:41:34    

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.

Reply

Marsh Posté le 27-06-2004 à 13:58:46    

on verra ça dans le train


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

Marsh Posté le 27-06-2004 à 14:05:51    

oui ?

Reply

Marsh Posté le 27-06-2004 à 14:05:51   

Reply

Marsh Posté le 27-06-2004 à 14:12:17    

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
Reply

Marsh Posté le 27-06-2004 à 14:19:45    

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.

Reply

Marsh Posté le 27-06-2004 à 14:25:24    

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

Reply

Marsh Posté le 27-06-2004 à 21:27:00    

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


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

Marsh Posté le 27-06-2004 à 21:31:04    

à 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

Reply

Sujets relatifs:

Leave a Replay

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