0Pricing
C++ Academy · Leçon

Modèles variadiques et paquets de paramètres

Utiliser des paquets de paramètres et des expressions de repli pour écrire des modèles variadiques

Modèles variadiques et paquets de paramètres est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.

Nombre variable d’arguments de modèle

Les modèles variadiques acceptent un nombre quelconque d’arguments de modèle. Ils servent notamment à écrire des fonctions comme std::make_unique, std::tuple et des fonctions de journalisation de style printf.

Syntaxe des paquets de paramètres

Utilisez typename... Ts pour déclarer un paquet de paramètres de type et Ts... pour le développer.

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

Développement d’un paquet

Les ... placés après une expression développent le paquet en une liste séparée par des virgules.

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

Modèles variadiques récursifs (ancien style)

Avant C++17, les fonctions variadiques étaient généralement écrites de manière récursive : traiter un argument, puis recommencer avec le reste.

// base case
void log() {}

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

Expressions de pliage (C++17)

C++17 a ajouté les expressions de pliage, bien plus claires que la récursion. Appliquez un opérateur à tout un paquet.

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

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

Opérateurs de pliage

Quatre formes de pliage :

  • (... op pack) — pliage à gauche sur un développement unaire
  • (pack op ...) — pliage à droite
  • (init op ... op pack) — pliage à gauche avec une valeur initiale
  • (pack op ... op init) — pliage à droite avec une valeur initiale

Afficher tous les arguments

Une tournure courante avec un pliage sur l’opérateur virgule.

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

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

Compter les arguments

sizeof...(pack) renvoie le nombre d’éléments d’un paquet au moment de la compilation.

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

Modèles de classes variadiques

Les modèles de classes peuvent également comporter des paquets de paramètres. Exemple : std::tuple<Ts...>.

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

Transmission parfaite avec des paquets

Combinez les modèles variadiques avec std::forward pour transmettre parfaitement des arguments quelconques à un constructeur.

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 de paquets de types

Avec la spécialisation de modèle ou les expressions de pliage, vous pouvez implémenter des opérations sur des listes au moment de la compilation : premier élément, dernier élément, décomposition tête/queue.

Pièges

Problèmes courants :

  • Oublier de développer le paquet (args au lieu de args...)
  • Ordre d’évaluation dans les expressions de pliage (la direction gauche ou droite est importante pour les opérations non associatives)
  • Temps de compilation accru en cas de récursion profonde

Vérification rapide

Quelle fonctionnalité de C++17 simplifie la somme de tous les éléments d’un paquet de paramètres ?

Récapitulatif

Les modèles variadiques gèrent un nombre variable d’arguments de modèle grâce aux paquets de paramètres. Les expressions de pliage de C++17 remplacent le code variadique récursif par des expressions concises. Associées à la transmission parfaite, elles permettent de créer des fonctions de fabrique et une sélection générique.

Questions Fréquemment Posées

La leçon « Modèles variadiques et paquets de paramètres » est-elle gratuite ?

Oui — le texte complet de « Modèles variadiques et paquets de paramètres » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Modèles variadiques et paquets de paramètres » ?

Utiliser des paquets de paramètres et des expressions de repli pour écrire des modèles variadiques Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C++ Academy ?

Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Modèles variadiques et paquets de paramètres » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?

Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèles de fonctions et de classes : révision
  2. Spécialisation partielle et complète des modèles
  3. Modèles variadiques et paquets de paramètres
  4. Fonctions constexpr et if constexpr
← Retour à C++ Academy