D/Szablony

Z Wikibooks, biblioteki wolnych podręczników.
< D
Przejdź do nawigacji Przejdź do wyszukiwania

Szablony[edytuj]

Przykłady[edytuj]

 1 module stack;
 2 
 3 /* Szablon klasy */
 4 /* T - typ podawany przy tworzeniu klasy */
 5 class Stack(T)
 6 {
 7 private:
 8     /* Tablica typu T */
 9     T[] tab;
10 public:
11     void push(T val)
12     {
13         /* Dopisanie wartości do tablicy */
14         tab ~= val;
15     }
16     void pop()
17     {
18         /* Obcięcie ostatniego elementu tablicy */
19         assert(!empty());
20         tab.length--;
21     }
22     T top()
23     {
24         /* Zwrócenie ostatniego elementu tablicy */
25         assert(!empty());
26         return tab[tab.length - 1];
27     }
28     bool empty()
29     {
30         /* Sprawdzenie czy tablica ma niezerową długość */
31         return tab.length == 0;
32     }
33 }
34 
35 int main(string[] args)
36 {
37     /* Nowy stos na elementy typu int */
38     auto s = new Stack!(int);
39     
40     /* Teraz można normalnie korzystać ze zdefiniowanych metod */
41 
42     return 0;
43 }
 1 module main;
 2 
 3 import std.stdio;
 4 
 5 /* Szablon rekurencyjny */
 6 /* Uniwersalna wersja */
 7 template factorial(int n)
 8 {
 9     /* Przyjmuje wartość iloczynu n i silni (n - 1) */
10     const factorial = n * factorial!(n-1);
11 }
12 /* Specjalizacja dla n = 1 */
13 template factorial(int n : 1)
14 {
15     /* Przyjmuje wartość 1 */
16     const factorial = 1;
17 }
18 
19 int main(string[] args)
20 {
21     /* Wyświetlenie 4!, całość wyliczana jest w trakcie     *
22      * kompilacji, więc program działa szybko, ale wartość, *
23      * której silnię chcemy obliczyć musi być stała.        */
24     writefln("%d! = %d", 4, factorial!(4));
25 
26 	return 0;
27 }

Ograniczenia[edytuj]

  • Parametry szablonów muszą być znane w trakcie kompilacji, nawet jeśli nie są to typy a np. wartości liczbowe.
  • Częściowo skomplikowany zapis – nie należy ich nadużywać.
  • Brak możliwości przeprowadzenia części niskopoziomowych optymalizacji klasy bez znajomości typu.