C++ Academy · Leçon

Quand utiliser CRTP

Évaluer les compromis et les pièges

Leçon 4 sur 413 étapes

Quand utiliser CRTP est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 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.

Un outil puissant mais délicat

CRTP est puissant, mais il complexifie le code. Cette leçon explique quand son utilisation est avantageuse et quels pièges éviter.

Bon choix : chemins critiques

Utilisez CRTP lorsque la suppression de la surcharge des appels virtuels est importante : boucles numériques serrées, modèles d’expressions ou interpréteurs dont le type est fixé à la compilation.

Bon choix : comportement réutilisable

CRTP excelle pour injecter un comportement réutilisable (compteurs, comparaisons, sérialisation) qui doit rappeler le type concret.

#include <iostream>
#include <string>

template <typename T>
struct Serializable {
    void save() const { std::cout << static_cast<const T*>(this)->serialize() << "\n"; }
};

struct Config : Serializable<Config> {
    std::string serialize() const { return "config-data"; }
};

int main() {
    Config{}.save();
    return 0;
}

Piège : aucun type commun à l’exécution

Si les appelants ont besoin d’un type unique à l’exécution pour stocker plusieurs formes ensemble, CRTP n’est d’aucune aide. Chaque instanciation est un type distinct.

  • Vous avez besoin de conteneurs polymorphes ? Utilisez des fonctions virtuelles

Piège : erreurs cryptiques

Les messages d’erreur de CRTP peuvent être longs et déroutants, car ils apparaissent au plus profond de l’instanciation des modèles. Une erreur de frappe dans le type dérivé de Base<Wrong> passe à la compilation jusqu’à ce qu’un appel tente d’utiliser une méthode manquante.

Piège : type dérivé incorrect

Transmettre le mauvais type à la base rompt le contrat de static_cast et entraîne un comportement indéfini. Écrivez toujours Derived : Base<Derived> en utilisant des noms correspondants.

#include <iostream>

template <typename T>
struct Base {
    void go() { static_cast<T*>(this)->step(); }
};

struct Right : Base<Right> {
    void step() { std::cout << "ok\n"; }
};

int main() {
    Right{}.go();
    return 0;
}

Alternative : std::variant

Lorsque vous disposez d’un ensemble fixe de types et souhaitez une sémantique de valeur, std::variant associé à std::visit offre une sélection à la compilation sans héritage et est souvent plus clair que CRTP.

#include <iostream>
#include <variant>

struct Add { int operator()(int a, int b) { return a + b; } };
struct Mul { int operator()(int a, int b) { return a * b; } };

int main() {
    std::variant<Add, Mul> op = Mul{};
    int r = std::visit([](auto f) { return f(3, 4); }, op);
    std::cout << r << "\n";
    return 0;
}

Alternative : concepts (C++20)

Pour vérifier une interface exclusivement à la compilation, les concepts de C++20 remplacent souvent CRTP. Ils contraignent les modèles et fournissent des messages d’erreur plus clairs, sans héritage.

Compromis de lisibilité

CRTP ajoute des mécanismes liés aux modèles que les débutants peuvent avoir du mal à lire. Réservez cette technique aux cas où l’avantage en performance ou en réutilisation compense clairement la complexité supplémentaire.

Considérations relatives à la maintenance

CRTP couple étroitement la base et la classe dérivée. Modifier l’interface de la classe hôte peut avoir des répercussions sur chaque module de composition. Documentez clairement les méthodes requises par la classe hôte.

  • Répertoriez les méthodes requises dans un commentaire
  • Préférez des modules de composition petits et ciblés

Liste de vérification pour décider

Utilisez CRTP lorsque :

  • Vous avez besoin d’une sélection statique pour gagner en vitesse
  • Vous injectez un comportement qui appelle le type concret
  • Vous n’avez pas besoin d’une base commune à l’exécution
  • La complexité est justifiée

Sinon, envisagez les fonctions virtuelles, les variantes ou les concepts.

Vérification rapide

Choisissez la meilleure alternative lorsque vous avez besoin d’un type commun à l’exécution.

Récapitulatif

Vous avez appris dans quels cas CRTP convient.

  • Excellent pour les chemins critiques et les comportements de rappel réutilisables
  • Peu adapté lorsqu’un type commun à l’exécution est requis
  • Méfiez-vous des erreurs cryptiques et de l’utilisation avec un type incorrect
  • Alternatives : fonctions virtuelles, std::variant, concepts de C++20
Gratuit pour commencer

Apprends C++ avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Quand utiliser CRTP » est-elle gratuite ?

Oui — le texte complet de « Quand utiliser CRTP » 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 « Quand utiliser CRTP » ?

Évaluer les compromis et les pièges 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 4 sur 4.

Combien de temps prend la leçon « Quand utiliser CRTP » ?

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. L’idiome CRTP
  2. Polymorphisme statique
  3. Mixins avec CRTP
  4. Quand utiliser CRTP
← Retour à C++ Academy