Programmation D - Modèles
Les modèles sont la base de la programmation générique, qui implique l'écriture de code d'une manière indépendante de tout type particulier.
Un modèle est un plan ou une formule pour créer une classe générique ou une fonction.
Les modèles sont la fonctionnalité qui permet de décrire le code comme un modèle, pour que le compilateur génère automatiquement le code du programme. Certaines parties du code source peuvent être laissées au compilateur pour être remplies jusqu'à ce que cette partie soit réellement utilisée dans le programme. Le compilateur remplit les parties manquantes.
Modèle de fonction
Définir une fonction en tant que modèle laisse un ou plusieurs des types qu'elle utilise comme non spécifiés, à déduire plus tard par le compilateur. Les types qui ne sont pas spécifiés sont définis dans la liste des paramètres du modèle, qui se situe entre le nom de la fonction et la liste des paramètres de la fonction. Pour cette raison, les modèles de fonctions ont deux listes de paramètres -
- liste de paramètres de modèle
- liste des paramètres de fonction
import std.stdio;
void print(T)(T value) {
writefln("%s", value);
}
void main() {
print(42);
print(1.2);
print("test");
}
Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -
42
1.2
test
Modèle de fonction avec plusieurs paramètres de type
Il peut y avoir plusieurs types de paramètres. Ils sont illustrés dans l'exemple suivant.
import std.stdio;
void print(T1, T2)(T1 value1, T2 value2) {
writefln(" %s %s", value1, value2);
}
void main() {
print(42, "Test");
print(1.2, 33);
}
Si nous compilons et exécutons le code ci-dessus, cela produirait le résultat suivant -
42 Test
1.2 33
Modèles de cours
Tout comme nous pouvons définir des modèles de fonctions, nous pouvons également définir des modèles de classes. L'exemple suivant définit la classe Stack et implémente des méthodes génériques pour pousser et faire apparaître les éléments de la pile.
import std.stdio;
import std.string;
class Stack(T) {
private:
T[] elements;
public:
void push(T element) {
elements ~= element;
}
void pop() {
--elements.length;
}
T top() const @property {
return elements[$ - 1];
}
size_t length() const @property {
return elements.length;
}
}
void main() {
auto stack = new Stack!string;
stack.push("Test1");
stack.push("Test2");
writeln(stack.top);
writeln(stack.length);
stack.pop;
writeln(stack.top);
writeln(stack.length);
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Test2
2
Test1
1