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); // 10Operatori 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.14Contare 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 (
argsinvece diargs...) - 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
- Ripasso dei template di funzioni e classi
- Specializzazione parziale e completa dei template
- Template variadici e parameter pack
- Funzioni constexpr e if constexpr