C++ Academy · Lektion

Variadiske skabeloner og parameterpakker

Brug parameterpakker og fold-udtryk til at skrive variadiske skabeloner

Lektion 3 af 414 trin

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);   // 10

Fold-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.14

Optæ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 (args kontra args...)
  • 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.

Gratis at komme i gang

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

  1. Funktions- og klasseskabeloner – repetition
  2. Skabelonspecialisering: delvis og fuldstændig
  3. Variadiske skabeloner og parameterpakker
  4. constexpr-funktioner og if constexpr
← Tilbage til C++ Academy