Colle C++ : pb de template abstrait - C++ - Programmation
Marsh Posté le 18-08-2007 à 20:17:00
bah le pb d'appel de virtuelle abstraite me parait independant du pb de template.
Ensuite, comme le disait la Mére Michel :
Melanger template et polymorphisme c'est pas bine bon.
Donc, le mieux c'ets de passer par une solution à base de template policy (comme expliqué dans le Alexandrescu 'Modern C+ Design')
en gros ca transforme ta hierarchie :
Point<T>, Point2D<T>, Point3D<T>, PointGeo<T>
en
Point<T,_2D>
Point<T,_3D>
Point<T,Geo>
ou _2D,_3D, Geo sont des classes comportant des memebres de classes (prefixés par static donc) qui contiennent le code qui change entre les implantations.
Marsh Posté le 18-08-2007 à 21:02:09
Ah oui, ça me plait davantage!
Mais là, je paye ma formation entièrement autodidacte pour le ++ du C, un peu trop vite faite à l'arrache. Ca sent donc le bouquin que je vais acheter rapidement si je ne trouve pas un exemple la de suite
A commencer par le fait que je n'ai encore jamais utilisé deux arguments dans un template
Merci en tout cas pour ces infos!
Marsh Posté le 18-08-2007 à 22:27:52
En vrac et pour commencer doucement sur les template avancée :
http://osl.iu.edu/~tveldhui/papers/techniques/
Marsh Posté le 18-08-2007 à 23:03:49
ReplyMarsh Posté le 18-08-2007 à 23:26:33
Waa c'est de la bonne URL, ça, bourrée d'info!
Arretez je vais me mettre à la bourre! :-)
et dire que je commençais à lorgner sur le D par curiosité...
Marsh Posté le 19-08-2007 à 18:39:10
Joel F a écrit : les traits c'est si peu comparé aux template policy |
J'ai du mal à te comprendre. Pour moi ce sont des choses qui se situent à des niveaux différents.
Les policies, qu'elles soient templates ou pas, c'est un design pattern.
Les traits, c'est au départ essentiellement une technique en C++ consistant à rassembler dans
un seul paramètre template une série d'entre eux. On arrive donc à des structs n'ayant que des
membres statiques. Quand ces paramètres concernent un type, on la paramètrise généralement
par ce type.
Certaines conceptions à base de politiques peuvent être implémentées avec des traits en C++. Ca
me semble être le cas pour ce problème.
Marsh Posté le 19-08-2007 à 19:06:20
je me suis mal exprimé. Dans ma tête, je voyais juste les traits tel que fournit par la STL. Mea culpa donc.
Marsh Posté le 18-08-2007 à 16:27:50
J'ai un probleme interessant de template abstrait en C++.
Contexte: je veux faire des classes de "points 2D entiers", "points 2D geodésiques", "coordonnées polaires", etc.
Non seulement je veux manipuler des données de type différents (flottants, entiers, etc, d'ou nécessité d'un template), mais pour des raisons de lisibilité et de sécurité je veux nommer les membres x et y spécifiquement (ici respectivement: i & j, lon & lat, size & angle).
Je veux aussi pouvoir ajouter des méthodes spécifiques à ces types de coordonnées.
Enfin, hors de question dans mon cas de devoir passer par des get/set verbeux pour l'acces aux membres, je veux un accès public direct aux membres x,y et lon,lat des classes filles.
En gros: je veux obliger l'utilisation de "x" pour la classe "point 2D" et obliger à utiliser "lon" pour la classe "points 2D géodésique".
Comme je ne pense pas qu'il soit possible de "masquer" ou privatiser certaines variables d'un union dans des classes dérivées, ca ne doit pas etre possible avec un template qui aurait des "unions" en float sur les différents nommages x et y (il permettrait d'utiliser salement "lon" à la place de "x" et vice versa).
Donc la solution à laquelle je pense c'est un template abstrait avec des accesseurs get/set virtuels purs protected sur les deux membres codant les coordonnées, qui sont alors définis dans des classes dérivées et qui permettent alors un acces rapide public et un nommage spécifique.
Maintenant le problème est lié aux méthodes du template qui *retournent* des instances du meme type que le template: elles font malheureusement appel à une classe virtuelle pure, aie: pas le droit! Comment faire alors?
Voila un bout de code qui montre le problème et permet d'essayer différentes solutions:
En attendant j'ai abdiqué et je le fais à l'ancienne, le bon vieux et moche template en pur C à base de #define paramétrés!