Salut a tous
Voila j'etais entrain de lire des tutos sur les templates
le probléme je vois pas a quoi vont servire les classes ou les fonctions templates
Version imprimable
Salut a tous
Voila j'etais entrain de lire des tutos sur les templates
le probléme je vois pas a quoi vont servire les classes ou les fonctions templates
A beaucoup de choses. Principalement à avoir du code qui s'adapte aux structures de données de son utilisateur final. Exemple bâteau : Tu veux mettre en place une classe de type liste chaînée. Ce qui est important à ce niveau, c'est la structure de la liste elle même. Ce qui sera dedans, peu importe. Pour parvenir à dire ce "peu importe" dans du code, il y a plusieurs solutions :
- Toutes les variétés de ce "peu importe" dériveront d'une classe de base, ou bien sera connu uniquement sous forme de pointeur void*. Outre le coût, cette solution demande à l'utilisateur de cette liste de passer outre le système de type, ce qui rend le code dangereux. C'est comme ça que faisaient Java ou C# dans leurs premières versions, ils sont revenus en arrière pour mettre en place un truc apparenté au templates.
- On fait tout par macro. Je crois que certains faisaient ainsi avant les templates en C++. Je n'ai heureusement jamais connu cette époque de martyrs.
- On fait une liste par type d'objet que l'on veut mettre dedans, par copier/coller/remplacer/adapter à partir d'une liste de base (c'est comme ça que font certains en C#1.0, peut-être aussi en vieux Java...).
- On fait par templates, qui sont de ce point de vue une façon d'automatiser le copier/coller/remplacer/adapter. Sachant que ce qui était nécessaire pour faire marcher le "adapter" permet d'aller bien plus loin que ce que les designers des templates avaient prévu. Mais c'est une autre histoire...
J'ajouterais à cela :
http://alp.developpez.com/tutoriels/traitspolicies/
http://alp.developpez.com/tutoriels/templaterebinding/
http://loulou.developpez.com/tutoriels/cpp/metaprog
Et de nombreux sujets sur le forum ;)
Un point important qui n'est pas connu d'assez de monde, c'est que les templates permettent une forme de polymorphisme statique... Un polymorphisme qui est utilisé à la compilation, exemple :
Tu peux en savoir plus sur ce genre d'utilisation des templates en lisant le premier lien que je t'ai donné ainsi qu'en faisant une recherche sur "templates" et/ou "polymorphisme statique" et/ou "politique", dans le forum C++.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 template <class Animal> class GestionAnimal { public : void faireBruit() { Animal::bruit(); } }; class Chien { static void bruit() { std::cout << "Ouaf ouaf" << std::endl; } }; class Chat { static void bruit() { std::cout << "Miaou miaou" << std::endl; } }; // ... GestionAnimal<Chien> gc; gc.faireBruit(); // affiche "Ouaf ouaf" GestionAnimal<Chat> gc2; gc.faireBruit(); // affiche "Miaou miaou"
Voilà ;)
Merci infiniment Alp mais je pense qu'il une petite erreur
Code:
1
2
3
4
5
6 Compiling... template1.cpp C:\Program Files\Microsoft Visual Studio\MyProjects\template1\template1.cpp(17) : error C2248: 'bruit' : cannot access private member declared in class 'Chien' C:\Program Files\Microsoft Visual Studio\MyProjects\template1\template1.cpp(23) : see declaration of 'bruit' C:\Program Files\Microsoft Visual Studio\MyProjects\template1\template1.cpp(16) : while compiling class-template member function 'void __thiscall GestionAnimal<class Chien>::faireBruit(void)' Error executing cl.exe.
remplaceparCode:class Chien
.Code:struct Chien
De même pour Chat
Effectivement, David a raison, j'ai écrit trop vite :oops:
Le soucis est que l'accessibilité est privée par défaut dans les classes, publique dans les structures.