Szablon funkcji

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Szablon funkcji lub funkcja szablonowa – jeden z dwóch rodzajów szablonów w języku programowania C++, dzięki któremu możliwe jest automatyczne generowanie nowych funkcji.

Ogólny przykład[edytuj]

template <class T> // deklaracja funkcji szablonowej
T add (T par1, T par2)
{
   return par1 + par2;
} 

int main() 
{
   int a = 5;
   int b = 8;
   int c = add<int> (a, b);
   float d = 3;
   float e = 4;
   float f = add<float> (d, e);
   return 0;
}

Powyżej znajduje się deklaracja funkcji szablonowej. Funkcja int main() zawiera dwa wywołania funkcji add<int>. Podczas kompilacji generowane są dwie funkcje o tej nazwie, ale z różnymi sygnaturami. Parametry szablonu podawane są w nawiasach trójkątnych.

Funkcja specjalizowana[edytuj]

Można jawnie podać specjalizację szablonu dla konkretnych typów. Deklaracja funkcji specjalizowanej musi znajdować się przed jej wywołaniem, gdyż w przeciwnym wypadku zostanie wykorzystana funkcja szablonowa.

template <class T>
T function (T a, T b)
{
  return a + b;
}

void function (char c, char d)
{
  cout << "\npodaj znak dla c: ";
  cin >> c;
  cout << "\npodaj znak dla d: ";
  cin >> d;
  cout << "\npodałeś znaki " << c << " i " << d << endl;
}

main() 
{
  int a2 = 4, b2 = 5;
  cout << function (a2, b2);
  char c2, d2;
  function (c2, d2);          
}

Właściwości[edytuj]

  • W miejscach wywoływania funkcji szablonowej nie zawsze jest konieczne określanie parametrów szablonu, ponieważ zostanie podjęta próba ich określenia korzystając z typów parametrów aktualnych wywołania. W związku z tym zamiast pisać dodaj<int>(a, b), zwykle wystarczy samo dodaj(a, b) ponieważ kompilator zna typy zmiennych a i b i na tej podstawie spróbuje dopasować wywołanie odpowiedniej funkcji (niekoniecznie szablonowej).
  • Podmiana parametrów formalnych podczas generowania funkcji szablonowej nie jest naiwna tzn. słowo określające parametr formalny zostanie podmienione na parametr aktualny tylko tam, gdzie jest ono użyte w kontekście typu. W szczególności nie zostaną podmienione wystąpienia słowa Typ w nazwach zmiennych, łańcuchach itp.