Szablony funkcji
Szablony klas definiują rodzinę pokrewnych klas, które są oparte na argumentach typu przekazywanych do klasy podczas tworzenia jej wystąpienia.Szablony funkcji są podobne do szablonów klas, ale definiują rodzinę funkcji.Dzięki szablonom funkcji, możesz określić zestaw funkcji, które są oparte na tym samym kodzie, ale działają na różnych typach lub klasach.Następujący szablon funkcji zamienia dwa elementy:
// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
T c(a);
a = b;
b = c;
}
int main() {
}
Ten kod definiuje rodzinę funkcji, które zamieniają wartości argumentów.Przy użyciu tego szablonu, możesz wygenerować funkcje, które będą zamieniać typy int i long oraz typy zdefiniowane przez użytkownika.MySwap będzie zamieniać nawet klasy, jeśli w klasie został poprawnie zdefiniowany konstruktor kopiowania i operator przypisania.
Ponadto, szablon funkcji zapobiega zamienianiu obiektów różnych typów, ponieważ kompilator zna typy parametrów a i b w czasie kompilacji.
Mimo że funkcja ta może zostać wykonana przez funkcję nieszablonową, za pomocą wskaźników o typie void, wersja z szablonem jest bezpieczna pod względem typu.Rozważ następujące wywołania:
int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k ); //OK
MySwap( j, Hello ); //error
Drugie wywołanie MySwap wyzwala błąd czasu kompilacji, ponieważ kompilator nie może wygenerować funkcji MySwap z parametrami różnego typu.Używając wskaźników typu void, oba wywołania funkcji spowodują poprawną kompilację, ale funkcja nie będzie działać poprawnie w czasie wykonywania.
Dopuszczalna jest jawna specyfikacja argumentów szablonu dla szablonu funkcji.Na przykład:
// function_templates2.cpp
template<class T> void f(T) {}
int main(int j) {
f<char>(j); // Generate the specialization f(char).
// If not explicitly specified, f(int) would be deduced.
}
Gdy argument szablonu jest określony jawnie, wykonywane są zwykłe konwersje niejawne, aby przekonwertować argument funkcji na typ odpowiadający parametrom szablonu funkcji.W powyższym przykładzie, kompilator konwertuje (char j) na typ int.
Zobacz też
Informacje
Tworzenie wystąpienia szablonu funkcji
Jawna specjalizacja szablonów funkcji