variadic template
Megjelenés
Főnév
variadic template (tsz. variadic templates)
- (informatika) A variadic template a C++11-től kezdve elérhető sablonprogramozási technika, amely lehetővé teszi, hogy sablonokat tetszőleges számú paraméterrel definiáljunk. Ez különösen hasznos függvények, osztályok vagy struktúrák esetén, ahol nem előre meghatározott számú típusra vagy értékre szeretnénk általánosítani.
🔹 Alapötlet
A variadic template használata során egy sablonparaméterből és egy parameter pack-ből álló lista fogad be tetszőleges számú típus- vagy értékparamétert:
template<typename First, typename... Rest>
void myFunction(First first, Rest... rest) {
// első paraméter: first
// maradék paraméterek: rest...
}
🔹 Függvénysablon – egyszerű példa
#include <iostream>
void print() {
std::cout << "Vége\n";
}
template<typename First, typename... Rest>
void print(First first, Rest... rest) {
std::cout << first << " ";
print(rest...); // rekurzív hívás
}
int main() {
print(1, 2.5, "szöveg", 'x');
}
📌 Ez a példa tetszőleges számú és típusú argumentumot fogad el és sorban kiírja őket. A rekurzió addig bontja le a Rest... listát, míg ki nem fogy.
🔹 Osztálysablon – Tuple jellegű példa
template<typename... Ts>
class MyTuple {};
// példányosítás:
MyTuple<int, double, std::string> t;
Ez csak mutatja, hogy az std::tuple mögött egy variadic template van. A teljes implementáció template rekurziót is alkalmaz.
🔹 Parameter pack kicsomagolása (unpacking)
A ... operátor a sablonparaméterlista végén, illetve a használatnál egyaránt fontos. Például:
template<typename... Args>
void logAll(Args... args) {
(std::cout << ... << args) << '\n'; // C++17 fold expression
}
Ez a fold expression egy C++17-es újdonság, mellyel a paramétereket egyetlen kifejezésben ki lehet bontani.
🔹 Rekurzív feldolgozás vs fold expression
🌀 Klasszikus rekurzió:
template<typename First, typename... Rest>
void foo(First f, Rest... r) {
// csinálj valamit f-fel
foo(r...); // maradék újrahívása
}
void foo() {
// üres lista esetén végrehajtandó alap eset
}
✅ Modern fold expression:
template<typename... Args>
void foo(Args... args) {
(..., std::cout << args); // C++17: left fold
}
🔹 Használat típuselemzésre – például sizeof...
template<typename... Args>
void countArgs(Args... args) {
std::cout << "Argumentumok száma: " << sizeof...(Args) << "\n";
}
Ez kiírja, hogy hány típusargumentumot kapott a sablon.
🔹 Típuslista bejárása
template<typename T>
void printType() {
std::cout << typeid(T).name() << "\n";
}
template<typename... Ts>
void printAllTypes() {
(printType<Ts>(), ...); // C++17 fold
}
🔹 Tipikus felhasználási területek
std::tuple,std::variantbelső implementáció- Logger osztályok, amelyek tetszőleges számú üzenetet kezelnek
- Generikus wrapper-ek (pl.
make_shared<T>(...)) - Type trait eszközök (pl.
std::is_same<Ts...>vizsgálat) - Funkcióláncok, DSL-ek (Domain-Specific Languages)
- Típusbiztos interfészek
interface<F, Args...>jelleggel
🔹 Összefoglalás
| Előny | Leírás |
|---|---|
| ✅ Tetszőleges számú típus/érték paramétert kezel | Nem kell külön példányokat írni 1, 2, 3 stb. paraméterre |
| ✅ Típusbiztonságos | Fordítási időben ellenőrizhető |
✅ Kombinálható constexpr-ral, if constexpr-ral, fold-dal |
Nagyon hatékony metaprogramozás |
| ✅ Átláthatóbb modern C++ (C++17+) esetén | Pl. fold expression segítségével |
| ❌ Nehéz olvasni, ha túl sok réteg van | Főleg rekurzió és sablonhiba esetén |
- variadic template - Szótár.net (en-hu)
- variadic template - Sztaki (en-hu)
- variadic template - Merriam–Webster
- variadic template - Cambridge
- variadic template - WordNet
- variadic template - Яндекс (en-ru)
- variadic template - Google (en-hu)
- variadic template - Wikidata
- variadic template - Wikipédia (angol)