C++ Academy · Les

Wanneer gebruikt u CRTP

Afwegingen en valkuilen

Les 4 van 413 stappen

Wanneer gebruikt u CRTP is een gratis C++ Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.

Een krachtig maar scherp hulpmiddel

CRTP is krachtig, maar maakt code ingewikkelder. In deze les leer je wanneer het de moeite waard is en welke valkuilen je moet vermijden.

Geschikt voor prestatiekritieke paden

Gebruik CRTP wanneer het belangrijk is om overhead van virtuele aanroepen te verwijderen: in krappe numerieke lussen, expressietemplates of interpreters waarbij het type tijdens de compilatie vaststaat.

Geschikt voor herbruikbaar gedrag

CRTP is bijzonder geschikt voor het toevoegen van herbruikbaar gedrag, zoals tellers, vergelijkingen en serialisatie, dat moet kunnen terugaanroepen naar het concrete type.

#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;
}

Valkuil: geen gemeenschappelijk type tijdens de uitvoering

Als aanroepers één type tijdens de uitvoering nodig hebben om veel vormen samen op te slaan, helpt CRTP niet. Elke instantiatie is een afzonderlijk type.

  • Polymorfe containers nodig? Gebruik virtuele functies

Valkuil: ondoorgrondelijke fouten

Foutmeldingen van CRTP kunnen lang en verwarrend zijn, omdat ze diep binnen de instantiatie van templates naar voren komen. Als je het afgeleide type in Base<Wrong> verkeerd schrijft, compileert de code totdat iets een ontbrekende methode aanroept.

Valkuil: verkeerd afgeleid type

Het doorgeven van het verkeerde type aan de basisklasse verbreekt het contract van static_cast en leidt tot ongedefinieerd gedrag. Schrijf altijd Derived : Base<Derived> met overeenkomende namen.

#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;
}

Alternatief: std::variant

Wanneer je een vaste verzameling types hebt en waardesemantiek wilt, biedt std::variant in combinatie met std::visit dispatch tijdens de compilatie zonder overerving. Dit is vaak duidelijker dan 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;
}

Alternatief: Concepts (C++20)

Voor pure controle van interfaces tijdens de compilatie vervangen C++20 concepts CRTP vaak. Ze beperken templates en leveren duidelijkere foutmeldingen zonder overerving.

Afweging rond leesbaarheid

CRTP voegt templateconstructies toe die nieuwkomers moeilijk kunnen vinden om te lezen. Gebruik het alleen wanneer het voordeel voor prestaties of hergebruik duidelijk opweegt tegen de extra complexiteit.

Aandachtspunten voor onderhoud

CRTP koppelt de basis- en afgeleide klasse nauw aan elkaar. Het herstructureren van de interface van de omringende klasse kan gevolgen hebben voor elke mixin. Documenteer de vereiste methoden duidelijk.

  • Vermeld vereiste methoden in een opmerking
  • Geef de voorkeur aan kleine, gerichte mixins

Checklist voor je keuze

Gebruik CRTP wanneer:

  • je statische dispatch nodig hebt voor snelheid
  • je gedrag toevoegt dat naar het concrete type aanroept
  • je geen gedeelde basisklasse tijdens de uitvoering nodig hebt
  • de complexiteit gerechtvaardigd is

Overweeg anders virtuele functies, variant of concepts.

Korte controle

Kies het beste alternatief wanneer je een gemeenschappelijk type tijdens de uitvoering nodig hebt.

Samenvatting

Je hebt geleerd wanneer CRTP geschikt is.

  • Ideaal voor prestatiekritieke paden en herbruikbaar terugaanroepgedrag
  • Ongeschikt wanneer een gemeenschappelijk type tijdens de uitvoering vereist is
  • Let op ondoorgrondelijke fouten en verkeerd gebruik van types
  • Alternatieven: virtuele functies, std::variant, C++20 concepts
Gratis beginnen

Leer C++ met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
51
Lessen
203

Veelgestelde vragen

Is de les “Wanneer gebruikt u CRTP” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Wanneer gebruikt u CRTP”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.

Wat leer ik in “Wanneer gebruikt u CRTP”?

Afwegingen en valkuilen Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C++ Academy te beginnen?

Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Wanneer gebruikt u CRTP”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C++ Academy?

Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Het CRTP-idioom
  2. Statische polymorfie
  3. Mixins met CRTP
  4. Wanneer gebruikt u CRTP
← Terug naar C++ Academy