0Pricing
C++ Academy · Lezione

Template variadici e parameter pack

Usi parameter pack ed espressioni fold per scrivere template variadici

Template variadici e parameter pack è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Numero variabile di argomenti dei template

I template variadici accettano un numero qualsiasi di argomenti dei template. Vengono utilizzati per scrivere funzioni come std::make_unique, std::tuple e sistemi di logging nello stile di printf.

Sintassi dei parameter pack

Utilizzi typename... Ts per dichiarare un parameter pack di tipi e Ts... per espanderlo.

template <typename... Args>
void print_all(Args... args) {
    // ...
}

Espansione del pack

I ... dopo un'espressione espandono il pack in un elenco separato da virgole.

template <typename... Args>
void pass_through(Args... args) {
    other_func(args...);    // pass each arg
}

Template variadici ricorsivi (stile precedente)

Prima di C++17, le funzioni variadiche venivano generalmente scritte in modo ricorsivo: si elaborava un argomento e poi si richiamava la funzione con i restanti.

// base case
void log() {}

// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
    std::cout << first;
    log(rest...);
}

Fold expression (C++17)

C++17 ha introdotto le fold expression, molto più chiare della ricorsione. Applicano un operatore a tutti gli elementi di un pack.

template <typename... Args>
auto sum(Args... args) {
    return (args + ...);    // fold +
}

std::cout << sum(1, 2, 3, 4);   // 10

Operatori delle fold expression

Esistono quattro forme di fold:

  • (... op pack) — fold a sinistra su un'espansione unaria
  • (pack op ...) — fold a destra
  • (init op ... op pack) — fold a sinistra con valore iniziale
  • (pack op ... op init) — fold a destra con valore iniziale

Stampare tutti gli argomenti

Un idioma comune con il fold sulla virgola.

template <typename... Args>
void print_all(Args... args) {
    ((std::cout << args << " "), ...);   // comma fold
}

print_all(1, "hi", 3.14);   // 1 hi 3.14

Contare gli argomenti

sizeof...(pack) restituisce il numero di elementi in un pack al momento della compilazione.

template <typename... Args>
void info(Args... args) {
    std::cout << "count = " << sizeof...(args);
}

Class template variadici

Anche i class template possono avere parameter pack. Esempio: std::tuple<Ts...>.

template <typename... Ts>
class Tuple {
    // implementation uses recursion or storage tricks
};

Perfect forwarding con i pack

Combini i template variadici con std::forward per inoltrare perfettamente argomenti arbitrari a un costruttore.

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)...));
}

Manipolazione dei type pack

Con la specializzazione dei template o le fold expression è possibile implementare operazioni su liste al momento della compilazione: primo elemento, ultimo elemento e scomposizione testa/coda.

Problemi comuni

Problemi comuni:

  • Dimenticare di espandere il pack (args invece di args...)
  • Ordine di valutazione nelle fold expression (la direzione, sinistra o destra, è importante per gli operatori non associativi)
  • Aumento del tempo di compilazione con una ricorsione profonda

Verifica rapida

Quale funzionalità di C++17 semplifica la somma di tutti gli elementi di un parameter pack?

Riepilogo

I template variadici gestiscono un numero variabile di argomenti dei template tramite i parameter pack. Le fold expression di C++17 sostituiscono il codice variadico ricorsivo con espressioni concise. Insieme al perfect forwarding, sono alla base delle factory function e del dispatch generico.

Domande Frequenti

La lezione «Template variadici e parameter pack» è gratuita?

Sì — il testo completo di «Template variadici e parameter pack» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Template variadici e parameter pack»?

Usi parameter pack ed espressioni fold per scrivere template variadici Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Template variadici e parameter pack»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ripasso dei template di funzioni e classi
  2. Specializzazione parziale e completa dei template
  3. Template variadici e parameter pack
  4. Funzioni constexpr e if constexpr
← Torna a C++ Academy