C++ Academy · Les

Templatespecialisatie: gedeeltelijk en volledig

Specialiseer templates voor specifieke typen en gedeeltelijke parameterpatronen

Les 2 van 414 stappen

Templatespecialisatie: gedeeltelijk en volledig is een gratis C++ Academy-les op CoddyKit. Dit is les 2 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.

Wanneer de generieke vorm niet volstaat

Soms heeft een specifiek type aangepast gedrag nodig. Met templatespecialisatie kun je een implementatie op maat voor een bepaald argument bieden.

Volledige specialisatie

Geef de exacte typen op en bied een volledig alternatief.

template <typename T>
struct Printer {
    void print(T x) { std::cout << x; }
};

template <>
struct Printer<bool> {
    void print(bool x) { std::cout << (x ? "true" : "false"); }
};

Een specialisatie gebruiken

De compiler kiest automatisch de specialisatie wanneer de typen overeenkomen.

Printer<int>  pi;  pi.print(42);     // 42
Printer<bool> pb;  pb.print(true);   // true

Een functietemplate specialiseren

Je kunt ook functietemplates specialiseren — maar geef de voorkeur aan overbelasting. Overbelaste functies werken beter samen met de normale regels voor naamopzoeking.

template <typename T> void f(T x) { /* general */ }
template <> void f<int>(int x) { /* int specific */ }

Waarom je overbelasting verkiest boven functiespecialisatie

Specialisatie van een functietemplate doet niet op dezelfde manier mee aan het bepalen van de juiste overbelasting. Overbelasting is duidelijker en voorkomt de valkuil "Waarom wordt mijn specialisatie niet aangeroepen?".

Gedeeltelijke specialisatie (alleen klassen)

Met gedeeltelijke specialisatie kun je een categorie typen op maat ondersteunen — bijvoorbeeld pointers, referenties of elke container.

template <typename T>
struct Type { static const char* name() { return "general"; } };

template <typename T>
struct Type<T*> { static const char* name() { return "pointer"; } };

template <typename T>
struct Type<std::vector<T>> { static const char* name() { return "vector"; } };

Toepassingen van gedeeltelijke specialisatie

Veelvoorkomende situaties:

  • Ander gedrag voor pointertypen
  • Geoptimaliseerde versie voor triviaal kopieerbare typen
  • Containerspecifieke overschrijvingen

Templates in std specialiseren

Je kunt templates specialiseren in de naamruimte std (met beperkingen) — meestal std::hash voor gebruikerstypen, zodat die in std::unordered_map kunnen worden opgeslagen.

template <>
struct std::hash<MyType> {
    size_t operator()(const MyType& v) const {
        return /* compute hash */;
    }
};

Wanneer gebruik je specialisatie?

Gebruik specialisatie wanneer:

  • Een type fundamenteel ander gedrag nodig heeft
  • Je geoptimaliseerde codepaden voor bekende typen nodig hebt
  • Je integreert met een generieke bibliotheek die traits gebruikt

Moderne alternatieven in C++

C++17 voegde if constexpr toe en C++20 concepts — beide vervangen specialisatie vaak door duidelijkere code.

template <typename T>
void print(const T& x) {
    if constexpr (std::is_same_v<T, bool>) {
        std::cout << (x ? "true" : "false");
    } else {
        std::cout << x;
    }
}

Specialisatiehiërarchie

Wanneer meerdere specialisaties van toepassing kunnen zijn, wint de meest specifieke. De compiler kiest ondubbelzinnig de juiste of geeft een fout.

Veelvoorkomende valkuilen

Twee belangrijke valkuilen:

  • Het vergeten van template <> bij een volledige specialisatie
  • Specialisaties zonder inline in headerbestanden plaatsen — dit leidt tot ODR-schendingen

Snelle controle

Welke soort specialisatie is niet rechtstreeks toegestaan voor functietemplates?

Samenvatting

Templatespecialisatie biedt typespecifieke implementaties. Bij volledige specialisatie leg je alle parameters vast; gedeeltelijke specialisatie (alleen voor klassetemplates) richt zich op categorieën. Moderne alternatieven zoals if constexpr en concepts leveren vaak duidelijkere code op.

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 “Templatespecialisatie: gedeeltelijk en volledig” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Templatespecialisatie: gedeeltelijk en volledig”, 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 “Templatespecialisatie: gedeeltelijk en volledig”?

Specialiseer templates voor specifieke typen en gedeeltelijke parameterpatronen 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 2 van 4.

Hoe lang duurt de les “Templatespecialisatie: gedeeltelijk en volledig”?

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. Functie- en classtemplates opnieuw bekeken
  2. Templatespecialisatie: gedeeltelijk en volledig
  3. Variadische templates en parameter packs
  4. constexpr-functies en if constexpr
← Terug naar C++ Academy