Vous l'avez désormais compris, une fonction patron est une sorte d'ensemble de fonctions, pouvant avoir des arguments différents en nombre et en type.
Par contre, quelque soit le type des arguments, les calculs qui sont réalisés dans la fonction sont identiques. On dira que les algorithmes sont identiques. Cela peut parfois poser des problèmes, dans le cas ou vous voulez changer l'algorithme pour un type spécifique.
Comprendre le compilateur
Lors de l'appel d'une fonction, le compilateur va chercher en premier les fonctions qui correspondent complètement à ce que l'utilisateur demande.
En d'autres termes, si le compilateur rencontre la ligne:
Code : C++1 | calculerSomme(int a, int b);
|
Il va chercher la fonction dont le prototype est de la forme:
Code : C++1 | type calculerSomme(int, int);
|
Il peut arriver que le compilateur ne trouve pas exactement ce qu'il recherche. Dans ce cas là, il va alors chercher les fonctions qui correspondent en utilisant les conversions de type.
Une conversion de type est la transformation d'une variable de type
Type1 en la même variable de type
Type2.
Il existe de nombreuses conversions de types.
Retenez juste que le compilateur est capable transformer une variable numérique en n'importe quelle variable numérique d'un autre type (même si celle-ci est dégradante).
Ruser pour mieux compiler
Il est alors simple de comprendre comment spécialiser sa fonction pour un type spécial de données.
Prenons le code suivant:
Code : C++ 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 | #include <iostream>
#include <string>
using namespace std;
template<typename Type> Type calculerSomme(Type operande1, Type operande2)
{
Type resultat = operande1 + operande2;
return resultat;
}
int calculerSomme(string operande1, string operande2)
{
int resultat;
resultat = operande1.size() + operande2.size();
cout << "Utilisation de la spécialisation" << endl;
return resultat;
}
int main()
{
int a = 20, b = 10;
string c = "Bonjour";
string d = " les zéros!";
cout << "La somme vaut " << calculerSomme(a, b) << endl;
cout << "La somme vaut " << calculerSomme(c, d) << endl;
system("PAUSE");
return 0;
}
|
Ce code va nous afficher ceci:
Code : Console | La somme vaut 30
Utilisation de la specialisation
La somme vaut 18 |
Ici, on veut pouvoir calculer la taille de deux chaînes et en renvoyer la somme.
Mais notre fonction patron n'a pas un algorithme adapté à cette opération.
On écrit donc à nouveau la fonction
calculerSomme, adaptée à l'envoi de
string. Ainsi lors de
calculerSomme(c, d), le compilateur recherche les fonctions qui correspondent exactement à l'appel. C'est ainsi qu'elle trouve notre nouvelle fonction, et pas notre fonction patron
Ici, le compilateur pourrait utiliser notre fonction patron.
Cependant il rencontre notre autre fonction calculerSomme, qui correspond exactement à ce qu'il recherche.
Il va donc utiliser cette fonction en priorité.