Spécialisation des templates - C++ - Programmation
Marsh Posté le 06-09-2003 à 01:24:00
ah, c interressant, je vais travailler ca, merci
Marsh Posté le 05-10-2003 à 13:48:39
Bonjour tout le monde !
J'ai hésite à créer un nouveau topic pour ma question. Taz, si tu penses que ca n'a pas sa place ici vu que je débute avec cà, je créerai un topic.
Ma question porte sur la spécialisation partielle des fonctions membres. Par exemple, voici un début de classe Matrix :
Code :
|
Mon but est ici de créer une classe permettant de manipuler des matrices d'un type T, de taille i_row * i_column.
J'aimerais pouvoir spécialiser quelques fonctions membres suivant le couple i_row et i_column, pour par exemple la fonction de calcul du déterminant.
D'abord, je définis une fonction générique :
Code :
|
Je souhaiterais pouvoir spécialiser le calcul de déterminant pour des valeurs particulières de i_row et i_column, par exemple 2. J'ai essayé cà :
Code :
|
Mais le compilateur me fait comprendre bien gentiment que c'est pas bon :
|
Je m'en suis sorti un temps à l'aide du polymorphisme et de l'héritage en changeant de point de vue, mais j'aimerais comprendre ici pourquoi ca ne fonctionne pas, mon but étant avant tout d'apprendre à manipuler les template
Merci à vous !
Marsh Posté le 05-10-2003 à 14:49:31
je lis à l'instant ta question : je te trouverais la référence, mais la spécialisation partielle de fonction n'est pas possible, donc idem pour les fonctions membres
Marsh Posté le 05-10-2003 à 14:58:13
Ok, au moins la réponse a le mérite d'être courte. De toute facon il me semblait plus cohérent d'utiliser le polymorphisme et l'héritage pour arriver à mes fins dans ce problème précis.
Je suis très intéressé par la référence, si tu tombes dessus
Encore merci à toi pour ta réponse !
Marsh Posté le 05-10-2003 à 15:00:59
non, reste avec les templates. seulement, défni une classe d'aide, avec une unique fonction membre static que tu spécialises autant que tu veux
Marsh Posté le 05-10-2003 à 15:02:32
la référence dans cet autre sujet (vers la fin) http://forum.hardware.fr/forum2.ph [...] 218&cat=10
Marsh Posté le 05-10-2003 à 15:07:42
Taz a écrit : non, reste avec les templates. seulement, défni une classe d'aide, avec une unique fonction membre static que tu spécialises autant que tu veux |
Ok je vais voir dans cette direction ! Et merci pour la référence !
@+
Marsh Posté le 05-10-2003 à 15:14:59
Evadream -jbd- a écrit : |
ou alors tu spécialise toute la classe (template<class T> class CMatrix<T,2,2> ), à toi de voir.
Marsh Posté le 05-10-2003 à 15:59:41
Mmm pourquoi pas, mais ca me semble être une solution de "facilité", non ? Enfin j'ai pas trop de recul vis à vis de ces problèmes, je vais explorer les deux voies
Merci à toi pour la proposition !
Marsh Posté le 05-10-2003 à 16:13:14
ce n'est pas une solution de facilité, c'est une très bonne solution. d'ailleurs ça me fait penser à un truc ...
Marsh Posté le 05-10-2003 à 16:15:46
Taz > Je vais utiliser la solution de SchnapsMann mais je garde ta solution sous la main. Je me laisse un peu de temps pour la mettre en place, si j'ai des soucis, je te demanderais
Merci encore !
Marsh Posté le 05-10-2003 à 16:17:20
Taz a écrit : ce n'est pas une solution de facilité |
Toutes mes confuses, il faut que j'arrête d'écrire tout ce que je pense =)
Marsh Posté le 05-10-2003 à 16:20:11
tant pis pour toi je t'aurais prévenu ... tu vas devoir te cogner toute la définition de la classe ...
Marsh Posté le 05-10-2003 à 16:21:51
Question : la spécialisation de la classe toute entière m'oblige t'elle à réecrire toutes les fonctions membres du modèle ?
Marsh Posté le 05-10-2003 à 16:22:30
Excellent, cross posting. Bon je laisse ma réponse pour la postérité.
Marsh Posté le 05-10-2003 à 17:31:18
J'ai du mal :|
J'ai essayé de procéder de la sorte, ds ma class CMatrix, est-ce correct ?
Code :
|
Par exemple, je veux spécialiser cette fonction pour les matrices 2,2, comment dois m'y prendre ? :
Code :
|
seulement, défini une classe d'aide, avec une unique fonction membre static que tu spécialises autant que tu veux |
Je ne vois pas comment faire Comment produire une fonction générique, et des fonctions spécialisées en utilisant ce mécanisme ?
Désolé de pas comprendre au quart de tour, malgré la qualité de tes topics.
Marsh Posté le 05-10-2003 à 18:02:35
ça t'arrive de lire ?
Citation : la spécialisation partielle de fonction n'est pas possible |
Marsh Posté le 05-10-2003 à 18:04:07
car c'est une sorte de spécialisation. ça va pouvoir marcher, mais tu vas dupliquer trop de code.
donc fais une classe extérieure pour calculer les det
Marsh Posté le 05-10-2003 à 18:07:09
Taz a écrit : non, reste avec les templates. seulement, défni une classe d'aide, avec une unique fonction membre static que tu spécialises autant que tu veux |
Je pensais que tu me proposais ici une solution pour pouvoir retrouver un mécanisme de spécialisation partiel pour des fonctions membres.
Lorsque j'ai utilisé la solution de SchnapsMann, tu as laissé entendre qu'il existait une meilleure solution
|
C'est cà que j'essaye en vain de réaliser, c'est tout
Marsh Posté le 05-10-2003 à 18:08:29
ReplyMarsh Posté le 05-10-2003 à 18:09:56
Evadream -jbd- a écrit : |
c'est le cas. une classe avec une seule fonction statique entièrement dédiée au calcul d'une fonction. tu peux la spécialiser dans tous les sens, tu réécris tout le code à chaque fois, ce qui n'est pas plus volumineux qu'une hypotétique spécialisation partielle de fonctions
Marsh Posté le 05-10-2003 à 19:08:07
/me n'avait remarqué que tu avais édité ton premier post pour y ajouter des exemples ! Merci !
Marsh Posté le 09-02-2004 à 20:20:49
il est possible de spécialiser un destructeur virtuel ?
(je remonte un vieux topic, mais il me semble que ce soit la place de la question )
j'ai essayer de faire ca :
Code :
|
mais ca compile pas ...
Marsh Posté le 09-02-2004 à 20:31:13
BlackGoddess a écrit : il est possible de spécialiser un destructeur virtuel ?
|
Il me semble que tu ne peux pas spécialiser juste une fonction membre seule. Tu dois commencer par spécialiser la classe elle même et à l'interrieur la fonction membre.
Code :
|
Edit : corrections pour que ça compile.
Marsh Posté le 09-02-2004 à 21:06:10
pourtant ceci compile :
(chez moi, je ne sais pas si c'est standard ...)
Code :
|
Marsh Posté le 09-02-2004 à 21:24:19
ca ne fonctionne pas pareil pour les destructeurs virtuels ?
Marsh Posté le 09-02-2004 à 22:04:23
apparement la spécialisation fonctionne (chez moi toujours) uniquement pour une spécialisation autre que les pointeurs...
est-ce un cas général ou est-ce mon compilo qui a du mal ?
Marsh Posté le 09-02-2004 à 22:32:22
c'est quoi ton compilateur ?
les (destructeurs) virtuels ça n'existe pas
Marsh Posté le 09-02-2004 à 22:43:00
vc++7
en fait
toujours avec
Code :
|
Code :
|
fonctionne, mais pas
Code :
|
j'ai fait un autre test :
Code :
|
la doc de l'erreur sur les msdn : http://msdn.microsoft.com/library/ [...] rC2768.asp
serait-ce un défaut du compilo pour cette spécialisation ?
(g bcp de mal a trouver de la doc sur la spécialisation pour pointeur sur le net ...)
Marsh Posté le 09-02-2004 à 23:01:43
erf ca a deja été dit ...
Code :
|
compile pas non plus ...
j'ai lu que vc++7.1 devait supporter les spécialisations partielles de classes templates, je vais l'installer, on a changé recemment les licenses au taff ...
Marsh Posté le 09-02-2004 à 23:04:31
pourtant c'est parfaitement correct./
il donne quoi mon premier exemple (premier message) ?
Marsh Posté le 09-02-2004 à 23:07:30
il fait les mêmes erreurs que mon précédent bout de code, une erreur de syntaxe sur le '>' de 'class Foo< T* >' suivie de quelques autres erreurs qui dérivent de celle la
Marsh Posté le 09-02-2004 à 23:09:21
ben tu vas ici http://forum.hardware.fr/hardwaref [...] -46017.htm
et tu leur dis que j'avais bien raison dans mon dernier message
Marsh Posté le 09-02-2004 à 23:11:12
j'ai suivi le topic oui
ils parlaient de vc++7.1, v l'installer pour voir si ca résoud le pb.
Marsh Posté le 10-02-2004 à 00:28:19
taz a écrit : ben tu vas ici http://forum.hardware.fr/hardwaref [...] -46017.htm |
tu t'en es pas remis hein ?
accroches toi, paske :
Code :
|
compile tres bien
Marsh Posté le 10-02-2004 à 00:30:21
D'ailleurs tous tes exemples compilent...
Dis, fais pas d'actes desperés hein ? Tu sais, ainsi va le monde, tout change, tout evolue, les vérités deviennent inexactes et tout ca...
Marsh Posté le 10-02-2004 à 00:57:22
fiou, install finie
la spécialisation partielle de fonction membres ne fonctionne toujours pas
Code :
|
par contre ce qu'a ecrit chrisbk compile en effet, je m'en suis donc tiré comme ca :
Code :
|
Marsh Posté le 28-07-2003 à 23:31:46
l'intéret c'est d'avoir une version générique passe partout, et des versions spécialisées pour certains types, souvent pour permettre des optimisations.
par exemple std::swap est muni de spécialisation pour les types de la STL. par exemple: quand on veut permuter 2 std::vector, il serait bête de procéder à plusieurs recopies (c'est à dire le swap de base, avec un variable temporaire) alors qu'on pourrait seulement se contenter de permuter 2 pointeurs (on permute les implémentations)
le code parle de lui même, petit exemple clef en main
autre exemple
et encore un
Message édité par Taz le 05-10-2003 à 14:53:29