[ Pobierz całość w formacie PDF ]
W tym przypadku tworzona jest instancja szablonu funkcji dla typu jako pa-
rametru szablonu. Nast¹pnie, podobnie jak w przypadku zwykÅ‚ych funkcji, kompilator
sprawdza, czy przekazane parametry mogą być użyte jako wartości typu , co jest
możliwe w naszym przykÅ‚adzie ze wzgl¹du na istnienie domyÅ›lnej konwersji typu
do typu .
400 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
n u h
Szablon może zostać zdefiniowany także dla różnych typów:
Problemem w tym przypadku jest typ wartoÅ›ci zwracanej przez funkcj¹, ponieważ
w momencie definiowania szablonu nie wiemy, który z parametrów zostanie zwrócony.
Dodatkowo, jeÅ›li zwrócony b¹dzie drugi parametr, dla wartoÅ›ci zwracanej utworzony
zostanie lokalny obiekt tymczasowy, ponieważ posiada ona inny typ. Obiekt tymczaso-
wy nie może zostać zwrócony przez referencj¹, wobec czego typ zwracany przez sza-
blon został zmieniony z na .
W takim przypadku lepszym rozwiązaniem jest możliwość jawnej kwalifikacji.
n n
Szablony mogą być przeciążane dla pewnych typów. W ten sposób ogólna implementa-
cja szablonu może zostać zastąpiona inną implementacją dla konkretnych typów. Roz-
wiÄ…zanie takie posiada szereg zalet:
Szablony funkcji mogą zostać zdefiniowane dla dodatkowych typów oraz ich
kombinacji (na przykład może zostać zdefiniowana funkcja o parametrach
typu i ).
Implementacje mogą zostać zoptymalizowane dla konkretnych typów.
Typy, dla których implementacja szablonu nie jest odpowiednia, mogą zostać
właściwie obsłużone.
Wywołanie szablonu dla C-łańcuchów (typ ) spowoduje błąd:
Implementacja szablonu porówna w tym przypadku adresy C-łańcuchów zamiast ich
zawartości (patrz podrozdział 3.7.3).
Problem ten możemy rozwiązać poprzez przeciążenie szablonu dla C-łańcuchów:
Rozdział 7. Szablony 401
Przeciążenie szablonu może także dotyczyć wskazników. Możemy w ten sposób sprawić,
że jeśli szablon zostanie wywołany dla wskazników, porównane zostaną wska-
zywane przez nie obiekty, a nie ich adresy. Na przykład:
Zwróćmy uwag¹, że jeÅ›li wskaznik ma zostać przekazany jako staÅ‚a referencja, sÅ‚owo
kluczowe musi zostać umieszczone po znaku gwiazdki. W przeciwnym razie za-
deklarowany zostanie wskaznik do stałej (patrz także podrozdział 4.4.6).
PrzeciążajÄ…c szablony funkcji powinniÅ›my wprowadzać jedynie niezb¹dne modyfikacje,
takie jak zmiany liczby parametrów czy jawne ich określenie. W przeciwnym razie
wprowadzone zmiany mogÄ… stać si¹ powodem powstawania nieoczekiwanych efektów.
Dlatego też w naszym przykładzie argumenty wszystkich przeciążonych implementacji
powinny być przekazywane poprzez stałe referencje:
Wykonanie przedstawionego poniżej programu:
402 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
spowoduje wyÅ›wietlenie nast¹pujÄ…cych napisów:
nn n
Szablony funkcji mogÄ… posiadać zmienne lokalne typu b¹dÄ…cego parametrem szablonu.
Na przykład szablon funkcji zamieniającej wartości dwóch parametrów może zostać
zaimplementowany w nast¹pujÄ…cy sposób (prosz¹ porównać z implementacjÄ… funkcji
przedstawionÄ… na stronie 185).
Zmienne lokalne mogą być również statyczne. W takim przypadku tworzone są zmien-
ne statyczne wszystkich typów, dla których wywoływany jest szablon funkcji.
u n
Szablony są schematami kodu kompilowanego po wybraniu określonego typu
danych.
Tworzenie kodu w j¹zyku C++ na podstawie szablonu nazywamy tworzeniem
instancji szablonu.
Rozdział 7. Szablony 403
Szablony mogą posiadać wiele parametrów.
Szablony funkcji mogą być przeciążane.
n
W takim sam sposób, jak parametryzowane są typy funkcji, mogą również być parame-
tryzowane typy w klasach. Możliwość taka jest szczególnie przydatna w przypadku
kontenerów używanych do zarządzania obiektami pewnego typu. Szablony klas możemy
wykorzystać do implementacji kontenerów, dla których typ elementów nie jest jeszcze zna-
ny. W terminologii obiektowej szablony klas nazywane sÄ… klasami parametryzowanymi.
Implementacja szablonów klas zostanie omówiona na przykładzie klasy stosu. Imple-
mentacja ta wykorzystywać b¹dzie szablon klasy , dost¹pny w bibliotece stan-
dardowej (patrz podrozdziały 3.5.1 i 9.1.1).
I n nu
Podobnie, jak w przypadku szablonów funkcji, także deklaracja i definicja szablonu
klasy umieszczana jest zwykle w pliku nagłówkowym. Zawartość pliku nagłówkowego
klasy jest nast¹pujÄ…ca:
404 C++. Programowanie zorientowane obiektowo. Vademecum profesjonalisty
nu
Podobnie, jak w przypadku szablonu funkcji, deklaracja szablonu klasy poprzedzona
jest okreÅ›leniem parametru typu (parametrów szablonu może być oczywiÅ›cie wi¹cej):
Zamiast słowa kluczowego może być też użyte słowo :
Wewnątrz klasy typ może być używany w deklaracjach składowych klasy i funkcji
składowych w taki sam sposób, jak każdy zwykły typ. W naszym przykładzie elementy
[ Pobierz całość w formacie PDF ]