Variadiske skabeloner og parameterpakker
Brug parameterpakker og fold-udtryk til at skrive variadiske skabeloner
Variadiske skabeloner og parameterpakker er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Et variabelt antal skabelonargumenter
Variadiske skabeloner accepterer et vilkårligt antal skabelonargumenter. De bruges til at skrive funktioner som std::make_unique, std::tuple og printf-lignende logning.
Syntaks for parameterpakker
Brug typename... Ts til at deklarere en typeparameterpakke og Ts... til at udfolde den.
template <typename... Args>
void print_all(Args... args) {
// ...
}Udfoldning af pakker
De tre prikker ... efter et udtryk udfolder pakken til en kommasepareret liste.
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}Rekursive variadiske skabeloner (gammel stil)
Før C++17 blev variadiske funktioner typisk skrevet rekursivt — behandl ét argument, og kald derefter funktionen rekursivt med resten.
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}Fold-udtryk (C++17)
C++17 tilføjede fold-udtryk — de er langt renere end rekursion. Anvend en operator på tværs af en pakke.
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10Fold-operatorer
Fire fold-former:
(... op pack)— venstrefold over en unær udfoldning(pack op ...)— højrefold(init op ... op pack)— venstrefold med init(pack op ... op init)— højrefold med init
Udskrivning af alle argumenter
Et almindeligt idiom med kommafold.
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14Optælling af argumenter
sizeof...(pack) returnerer antallet af elementer i en pakke ved kompilering.
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}Variadiske klasseskabeloner
Klasseskabeloner kan også have parameterpakker. Eksempel: std::tuple<Ts...>.
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};Perfekt videresendelse med pakker
Kombinér variadiske skabeloner med std::forward for at videresende vilkårlige argumenter perfekt til en konstruktør.
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 af typepakker
Med skabelonspecialisering eller fold-udtryk kan du implementere listeoperationer ved kompilering: første element, sidste element og opdeling i hoved og hale.
Faldgruber
Almindelige problemer:
- At glemme at udfolde pakken (
argskontraargs...) - Evalueringsrækkefølgen i fold-udtryk (venstre kontra højre er vigtigt for ikke-associative operatorer)
- Forlænget kompileringstid ved dyb rekursion
Hurtigt tjek
Hvilken C++17-funktion gør det enklere at summere alle elementer i en parameterpakke?
Opsummering
Variadiske skabeloner håndterer et variabelt antal skabelonargumenter via parameterpakker. C++17-fold-udtryk erstatter rekursiv variadisk kode med korte udtryk. Kombineret med perfekt videresendelse danner de grundlag for factory-funktioner og generisk dispatch.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Variadiske skabeloner og parameterpakker” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Variadiske skabeloner og parameterpakker”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Variadiske skabeloner og parameterpakker”?
Brug parameterpakker og fold-udtryk til at skrive variadiske skabeloner Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Variadiske skabeloner og parameterpakker”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Funktions- og klasseskabeloner – repetition
- Skabelonspecialisering: delvis og fuldstændig
- Variadiske skabeloner og parameterpakker
- constexpr-funktioner og if constexpr