Spécialisation d'un modèle vers modèle utilisant des pointeurs - C++ - Programmation
Marsh Posté le 16-03-2007 à 08:45:59
Bon ... y a des trucs à revoir :|
Deja ton schéma d'héritage entre modèle me
parait pas la meilleur solution. Ensuite, tu
cherche à spécialiser partiellement une méthode
de ton modèle dans le cas ou T2 est un pointeur.
Pour cela, il te faut résoudre 2 problèmes :
-> générer un type de retour valide
-> changer le contenu de ta méthode.
Une maniére plus propre consiste à :
1/ Génération du type de retour :
On utilise une technique qui s'appelle les Traits.
Cette technique consiste à utiliser des spécialisations
de template comme un filtre logique (un match en ML).
Ici on a deux cas :
T2 quelconque -> on renvoit T2&
T2* -> on renvoit T2*
En outre, lorsque tu crée T2& , il faut faire gaffe au fait
que T2 ne soit pas déjà une référence ! On crée donc le modèle
suivant
Code :
|
On peut désormais récupérer le type de retour de manière géénrique.
2/ Modifier le contenu de ta méthode
Même constat. On va exporter le code dabs un modèle ad-hoc qui sera appelé depuis ton modèle.
On crée donc un modèle qui ne contient que ton code de recherche dnas chaque cas.
Code :
|
Au final le code de Map<T,T2>::operator[] devient
Code :
|
Voila le principe.
Ensuite quelques conseils :
1/ std::map pue du bec que tu ai envie d'en réécrire un moins bien ?
2/ Y a plein de problème de const qui manque partout ...
3/ Il faut garder à l"esprit que lorsque tu écris du code à base de template, il faut que la PLUS GROSSE PARTIE du code manipulant des types soit générique. T2& c'ets pas générique, return_type l'est beaucoup plus car tu contrôle précisement tes schémas de spécialisation.
4/ utilise le plus possible les modéles de BOOST::Traits et de BOOST::mpl pour te simplifier la vie sur ce genre de tests
Marsh Posté le 16-03-2007 à 12:30:37
Merci, beaucoup de ton aide !
Bon, je vais m'entrainer encore mais j'ai compris le principe
bien sur, il est clair que c'est pas que la std::map "pue du bec" que j'ai essayé d'en faire une mais en fait c'est un exercice qui étais proposé dans mon Stroustrup. Je viens de lire le chapitre sur les modèles et donc je fais ensuite les exercices
Donc je vais améliorer tout ça... Merci pour tes conseils et de m'avoir montré le principe qu'il faut utiliser
Marsh Posté le 16-03-2007 à 12:33:53
ReplyMarsh Posté le 16-03-2007 à 19:03:44
Taz a écrit : ouaich, vive les traits (que y en a plein de défini en standard déjà) |
mmouuais. C'est dans TR1, et ce sera probablement au prochain standard, mais c'est surclassé par les concepts.
Marsh Posté le 15-03-2007 à 18:40:37
Bonjour,
Je me suis posé un petit exercice : j'ai d'abord cherché à créer un modèle de conteneur associatif.
Ce qui me donne :
Donc ça, j'ai pas de soucis : ça marche. Mais a titre d'exercice je me suis dit que j'allais chercher a traiter autrement les pointeurs. Donc pour cela j'ai dérivé mon modèle comme ça :
Mais la, mon problème c'est qu'il est pas content que le type de retour de mon opérateur [] change entre la classe mère et la classe fille. Ce que je comprend... mais en fait je vois pas comment régler le problème. (autre que de changer d'exemple pour m'entrainer à ce type de spécialisation... )
Donc, je sais pas si vous voyez une solution...
Merci
ps : au passage si il y a quelque chose qui vous choque dans mon utilisation des modèles, merci de me le signaler (je demande qu'a m'améliorer )