Ugrás a tartalomhoz

function template

A Wikiszótárból, a nyitott szótárból


Főnév

function template (tsz. function templates)

  1. (informatika) A function template (függvény sablon) a C++ nyelvben lehetővé teszi, hogy típusfüggetlen függvényeket írjunk. Olyan algoritmusokat valósíthatunk meg vele, amelyek különböző típusú adatokkal is működnek anélkül, hogy minden típusra újra kellene írni a függvényt.



🔧 Alapszintaxis

template <typename T>
T maximum(T a, T b) {
    return (a > b) ? a : b;
}
  • template <typename T> – Ez határozza meg, hogy a függvény egy sablon. A T itt egy típusparaméter.
  • T maximum(T a, T b) – Ez a függvény bármilyen típusú a és b paramétert elfogad, ha az adott típusra értelmezett a > operátor.



💡 Használat

int a = 5, b = 8;
std::cout << maximum(a, b) << std::endl; // int

double x = 4.3, y = 2.1;
std::cout << maximum(x, y) << std::endl; // double

std::string s1 = "alma", s2 = "banan";
std::cout << maximum(s1, s2) << std::endl; // string lexikografikus összehasonlítás

A típus automatikusan kitalálásra kerül a paraméterek alapján – ezt nevezzük type deduction-nek.



🧭 Típus explicit megadása

std::cout << maximum<int>(10, 20); // itt megmondjuk, hogy T = int

Ez akkor lehet hasznos, ha a fordító nem tudja eldönteni, hogy milyen típust használjon.



⚙️ Több sablonparaméter

template <typename T1, typename T2>
void printPair(T1 a, T2 b) {
    std::cout << a << ", " << b << std::endl;
}

Használat:

printPair<int, std::string>(42, "alma");

🛠️ Típuskonverzió figyelése

template <typename T>
T add(T a, T b) {
    return a + b;
}

add(1, 2.5); // fordítási hiba, vagy double-re történő kényszerítés kell

A sablon függvényeknél a két paraméter típusa azonos kell legyen (ha egyetlen T szerepel). Ha int és double keveredik, használhatsz több típusparamétert vagy explicit konverziót.



🔍 Overload és specializáció

A függvény sablonokat túlterhelhetjük (overload), sőt specializálhatjuk is:

template <>
std::string maximum<std::string>(std::string a, std::string b) {
    std::cout << "String összehasonlítás" << std::endl;
    return (a.length() > b.length()) ? a : b;
}

Ez az úgynevezett teljes specializáció: csak akkor fut, ha T == std::string.



🧠 SFINAE (haladó)

SFINAE = Substitution Failure Is Not An Error. Lehetővé teszi, hogy a sablon csak akkor legyen engedélyezett, ha bizonyos feltételek teljesülnek.

template<typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
increment(T x) {
    return x + 1;
}

Ez csak akkor működik, ha T egy egész típus (pl. int, long, char stb.)



🧪 Összefoglalás

Előny Hátrány
Kód újrahasznosítás típusfüggetlen módon Hibaüzenetek lehetnek bonyolultak
Egyszerűbb kód fenntartás és karbantartás Fordítási idő növekedhet
Könnyű használni az STL és más sablonos kódok mellett Típuskompatibilitási hibák bonyolultabbak lehetnek



📦 STL függvénysablonok példája

template<class ForwardIterator, class T>
ForwardIterator find(ForwardIterator first, ForwardIterator last, const T& value);

Ez az STL std::find() függvénye. Akármilyen konténerre működik, ha van hozzá iterátor.