przykład szablonu funkcji:
template<class T> inline const T& FunMax(const T&, const T&) { return a < b ? b : a; }
Przykładowe poprawne i błędne wywołania:
cout << FunMax(3, 4) << endl; cout << FunMax(3.5, 4) << endl; // BŁĄD! cout << FunMax(static_cast<int>(3.5), 4) << endl; cout << FunMax<double>(3.5, 4) << endl; cout << FunMax<int>(3.5, 4) << endl; cout << FunMax(3.5, 4.0) << endl; cout << FunMax('a','d') << endl;
Funkcje wzorcowe z wieloma parametrami
W celu uniknięcia niejednoznaczności przy tworzeniu egzemplarzam funkcji wzorcowej można zadeklarować więcej niż jednen parametr wzorca. Na przykład:
template<class T1, class T2> inline T1 FunMax2(const T1&, const T2&) { return a < b ? b : a; }
W powyższym przykładzie typ zwraczny jest dedukopwany na podstawie pierwszego argumentu.
Możemy też dodać parametr, który będzie określał typ zwracany
template<class T1, class T2, class TR> inline TR FunMax3(const T1&, const T2&) { return a < b ? b : a; }ale przy tworzeniu egemplarza musimy jawnie określić wszystkie typy (typ zwracany nie wchodzi do sygnatury funcji, więc nie może być wydedukowany):
FunMax3<float, int, float>(3.5, 4);
Wygodniej jest przestawić kolejność parametrów otrzymując:
template<class TR, class T1, class T2> inline TR FunMax4(const T1&, const T2&) { return a < b ? b : a; }Teraz przy tworzeniu egzemplarza wystarczy podać pierwszy argumentu
FunMax4<float>(3.5, 4);
Specjalizacja
Funkcje wzorcowe można specjalizować, tj. definiować specjale ich wersje dla określonego zestawu parametrów. Na przykład:
//specjalizacja template<> inline const string& FunMax(const string& a, const string& b) { return a ; }Zatem jeśli napiszemy:
//specjalizacja cout << FunMax<string>("Ala","Ola") << endl; cout << FunMax<string>("Ola","Ala") << endl; string s1 = "Ala"; string s2 = "Ola"; cout << FunMax(s1, s2) << endl; cout << FunMax(s2, s1) << endl;to argumenty nie będą dedukowane na podstawie ogólnego wzorca, tylko kompilator skorzysta z wersji specjalizowanej.