Variadische Templates und Parameter-Packs
Verwenden Sie Parameter-Packs und Fold-Ausdrücke, um variadische Templates zu schreiben.
Variadische Templates und Parameter-Packs ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Variable Anzahl von Templateargumenten
Variadische Templates akzeptieren eine beliebige Anzahl von Templateargumenten. Sie werden verwendet, um Funktionen wie std::make_unique, std::tuple und printf-style-Logging zu schreiben.
Syntax von Parameter-Packs
Verwenden Sie typename... Ts, um einen Typparameter-Pack zu deklarieren, und Ts..., um ihn zu expandieren.
template <typename... Args>
void print_all(Args... args) {
// ...
}Pack-Expansion
Die ...-Auslassung hinter einem Ausdruck expandiert den Pack zu einer kommagetrennten Liste.
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}Rekursive variadische Templates (alter Stil)
Vor C++17 wurden variadische Funktionen typischerweise rekursiv geschrieben – ein Argument verarbeiten und anschließend mit den übrigen rekursiv fortfahren.
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}Fold-Ausdrücke (C++17)
C++17 führte Fold-Ausdrücke ein – deutlich übersichtlicher als Rekursion. Wenden Sie einen Operator auf einen Pack an.
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10Fold-Operatoren
Vier Fold-Formen:
(... op pack)– linker Fold über eine unäre Expansion(pack op ...)– rechter Fold(init op ... op pack)– linker Fold mit Initialwert(pack op ... op init)– rechter Fold mit Initialwert
Alle Argumente ausgeben
Ein gängiges Idiom mit einem Komma-Fold.
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14Argumente zählen
sizeof...(pack) gibt zur Compile-Zeit die Anzahl der Elemente in einem Pack zurück.
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}Variadische Klassentemplates
Auch Klassentemplates können Parameter-Packs enthalten. Beispiel: std::tuple<Ts...>.
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};Perfect Forwarding mit Packs
Kombinieren Sie variadische Templates mit std::forward, um beliebige Argumente perfekt an einen Konstruktor weiterzuleiten.
template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}Manipulation von Typ-Packs
Mit Template-Spezialisierungen oder Fold-Ausdrücken können Sie Listenoperationen zur Compile-Zeit implementieren: erstes Element, letztes Element sowie die Zerlegung in Kopf und Rest.
Fallstricke
Häufige Probleme:
- Den Pack nicht zu expandieren (
argsstattargs...) - Auswertungsreihenfolge in Fold-Ausdrücken (bei nichtassoziativen Operatoren ist links oder rechts entscheidend)
- Verlängerte Kompilierzeit durch tiefe Rekursion
Schnelltest
Welche C++17-Funktion vereinfacht das Addieren aller Elemente eines Parameter-Packs?
Zusammenfassung
Variadische Templates verarbeiten über Parameter-Packs eine variable Anzahl von Templateargumenten. C++17-Fold-Ausdrücke ersetzen rekursiven variadischen Code durch kompakte Ausdrücke. Zusammen mit Perfect Forwarding bilden sie die Grundlage für Factory-Funktionen und generisches Dispatching.
Häufig gestellte Fragen
Ist die Lektion „Variadische Templates und Parameter-Packs“ kostenlos?
Ja — der vollständige Text von „Variadische Templates und Parameter-Packs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Variadische Templates und Parameter-Packs“?
Verwenden Sie Parameter-Packs und Fold-Ausdrücke, um variadische Templates zu schreiben. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Variadische Templates und Parameter-Packs“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Funktions- und Klassentemplates aufgefrischt
- Templatespezialisierung: partiell und vollständig
- Variadische Templates und Parameter-Packs
- constexpr-Funktionen und if constexpr