function template
Főnév
function template (tsz. function templates)
- (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. ATitt egy típusparaméter.T maximum(T a, T b)– Ez a függvény bármilyen típusúaésbparamé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.
- function template - Szótár.net (en-hu)
- function template - Sztaki (en-hu)
- function template - Merriam–Webster
- function template - Cambridge
- function template - WordNet
- function template - Яндекс (en-ru)
- function template - Google (en-hu)
- function template - Wikidata
- function template - Wikipédia (angol)