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.