logo

Funkcje wzorcowe


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.
logo