Spécialisation d'une fonction template un peu tordue... [C++] - C++ - Programmation
Marsh Posté le 09-02-2010 à 14:16:44
MrDiablo a écrit : Bonjour
|
Ca ne me semble pas evident du tout. Je ne vois pas comment faire une
telle specialisation qui tienne la route.
Citation : L'idée serait de spécialiser IsEqual avec la class Size, histoire d'avoir un code similaire à ça :
|
Ce que tu ecris n'est pas une specialisation, mais une surcharge. Et ca
devrait fonctionner sans probleme. En tout cas
Code :
|
a le comportement auquel je m'attends. (Note que j'ai ecrit
isEqual(a.width, b.width) et non isEqual<T>(a.width, b.width) pour
permettre a une eventuelle autre surcharge de jouer son role).
Une specialisation partielle s'ecrirait
Code :
|
Mais effectivement, on ne peut pas specialiser partiellement une fonction.
Marsh Posté le 09-02-2010 à 15:10:39
En tout premier lieu, merci pour ta réponse
Un Programmeur a écrit : |
Effectivement (et c'est pour cette raison que j'ai posté, c'est bien la première fois que je demande de l'aide ainsi).
Citation : |
Exactement. Je n'ai pas dit qu'il s'agissait d'une spécialisation, mais d'une solution (qui me permet d'avancer et d'éviter de rester coincer sur le sujet... au moins, j'ai un programme qui tourne, même si ce n'est pas l'idéal). J'en ai parlé pour éviter qu'elle soit aborder
Citation : |
Rien à redire ^^
Marsh Posté le 09-02-2010 à 15:25:45
MrDiablo a écrit : |
Tu ici parlais des doubles. Je faisais allusion au fait qu'une specialisation pour les doubles faisant intervenir un epsilon a toutes les chances de ne pas etre transitive ce qui, en plus du probleme de determination d'un epsilon adequat, va la rendre aussi problematique que la version avec l'operateur ==.
Les flottants, c'est delicats.
Marsh Posté le 09-02-2010 à 19:01:19
Un Programmeur a écrit : |
Code :
|
c'est pas bon? (mis à part l'égalité de floats)
Marsh Posté le 09-02-2010 à 19:06:45
À première vue, trois problèmes. Ça n'utilise pas isEqual (qui peut être spécialisé ou surchargé) pour comparer les membres, ça ajoute un opérateur== qui peut ne pas être désiré, l'opérateur== n'est pas symétrique (visible si il y a des conversions implicites vers Size<T> ).
Marsh Posté le 09-02-2010 à 19:21:19
Un Programmeur a écrit : l'opérateur== n'est pas symétrique (visible si il y a des conversions implicites vers Size<T> ). |
T'as un exemple là dessus?
Marsh Posté le 28-02-2010 à 00:44:53
Code :
|
J'avoue que souvent je mets aussi operator== en methode membre par pure flemme, mais c'est pas bien, sauf si t'es absolument certain que ton type ne sera pas dérivé, implicit-casté etc...
Marsh Posté le 28-02-2010 à 08:06:08
les opérateurs binaires, sauf semantique spéciale n'ont pas a etre membre ou friend. Des fonctions libres suffisent.
Marsh Posté le 09-02-2010 à 13:35:42
Bonjour
J'ai une question à laquelle je n'arrive pas à trouver de solution : j'ai une fonction template que je voudrais spécialiser pour une instance d'une classe template.
Un exemple valant mieux qu'un long discourt, voici mon cas. J'ai la classe templatisée suivante :
Ainsi que la fonction template suivante :
Bien évidemment, il y a eut des spécialisations pour cette méthode (notamment pour les cas des doubles).
L'idée serait de spécialiser IsEqual avec la class Size, histoire d'avoir un code similaire à ça :
Bien évidemment, ça ne marche pas (sinon je ne posterais pas là ^^)... pour spécialiser, il faut que je spécifie "template<>" j'ai beau cherché, je ne trouve pas de solutions Enfin si, j'ai une solution, mais qui ne me convient pas vraiment (elle a le mérite de marcher au moins) : c'est de surdéfinir l'opérateur == de Size :
(c'est ce que je fais pour le moment, faute de mieux)
Auriez vous une idée de réaliser la chose ? Un grand merci par avance
Message édité par MrDiablo le 09-02-2010 à 13:57:18