C++ Academy · Les

Volledige specialisatie

Pas templates aan voor een type

Les 1 van 413 stappen

Volledige specialisatie is een gratis C++ Academy-les op CoddyKit. Dit is les 1 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.

Samenvatting: templates

Met een template kan één stuk code met veel typen werken. De compiler genereert een concrete versie voor elk type dat je gebruikt.

  • De algemene vorm verwerkt elk type.
  • Soms heeft één type een speciale behandeling nodig.
#include <iostream>

template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }

int main() {
    std::cout << maxOf(3, 9) << ' ' << maxOf(2.5, 1.5) << '\n';
    return 0;
}

Wat is volledige specialisatie?

Volledige specialisatie biedt een volledig afzonderlijke implementatie voor één specifiek type en vervangt voor alleen dat type de algemene template.

#include <iostream>

template <typename T>
void describe(T) { std::cout << "some type\n"; }

template <>
void describe(int) { std::cout << "an int\n"; }

int main() {
    describe(3.14);
    describe(42);
    return 0;
}

De syntaxis

Een volledige specialisatie begint met lege punthaken template <> en vermeldt het exacte type in de specialisatie.

#include <iostream>

template <typename T>
struct TypeName { static const char* get() { return "unknown"; } };

template <>
struct TypeName<bool> { static const char* get() { return "bool"; } };

int main() {
    std::cout << TypeName<double>::get() << '\n';
    std::cout << TypeName<bool>::get() << '\n';
    return 0;
}

Een klassetemplate specialiseren

Volledige klassetemplates kunnen worden gespecialiseerd, waardoor een type eigen leden en gedrag krijgt die afwijken van de primaire template.

#include <iostream>

template <typename T>
struct Storage {
    T value;
    void show() { std::cout << "value: " << value << '\n'; }
};

template <>
struct Storage<bool> {
    bool value;
    void show() { std::cout << (value ? "true" : "false") << '\n'; }
};

int main() {
    Storage<int> s{5}; s.show();
    Storage<bool> b{true}; b.show();
    return 0;
}

Waarom specialiseren?

Specialisatie verwerkt typen die andere logica nodig hebben, zoals const char*, waarvoor tekenreeksen vergelijken nodig is in plaats van pointers vergelijken.

#include <iostream>
#include <cstring>

template <typename T>
bool equal(T a, T b) { return a == b; }

template <>
bool equal(const char* a, const char* b) { return std::strcmp(a, b) == 0; }

int main() {
    std::cout << std::boolalpha;
    std::cout << equal(5, 5) << '\n';
    std::cout << equal("hi", "hi") << '\n';
    return 0;
}

Eén lid specialiseren

Bij een klassetemplate kun je voor een bepaald type slechts één lidfunctie specialiseren en de rest opnieuw gebruiken.

#include <iostream>

template <typename T>
struct Printer {
    void print(T v) { std::cout << v << '\n'; }
};

template <>
void Printer<char>::print(char v) {
    std::cout << "char: " << v << '\n';
}

int main() {
    Printer<int>{}.print(7);
    Printer<char>{}.print('A');
    return 0;
}

Een exacte overeenkomst gaat voor

Wanneer er een volledige specialisatie voor het exacte type bestaat, geeft de compiler daar altijd de voorkeur aan boven de primaire template.

#include <iostream>

template <typename T>
int rank() { return 0; }

template <>
int rank<double>() { return 99; }

int main() {
    std::cout << rank<int>() << ' ' << rank<double>() << '\n';
    return 0;
}

Specialisatie moet na de primaire template komen

Een specialisatie moet nadat de primaire template zichtbaar is worden gedeclareerd; anders heeft de compiler niets om te specialiseren.

#include <iostream>

template <typename T>
const char* kind() { return "generic"; }

template <>
const char* kind<float>() { return "float"; }

int main() {
    std::cout << kind<int>() << ' ' << kind<float>() << '\n';
    return 0;
}

std-templates specialiseren

Je mag sommige templates uit de standaardbibliotheek, zoals std::hash, specialiseren voor je eigen typen, zodat ze met gehashte containers werken.

#include <iostream>

struct Point { int x, y; };

template <typename T>
struct Hasher { size_t operator()(const T&) { return 0; } };

template <>
struct Hasher<Point> {
    size_t operator()(const Point& p) { return p.x * 31 + p.y; }
};

int main() {
    Hasher<Point> h;
    std::cout << h(Point{2, 3}) << '\n';
    return 0;
}

Specialisatie op waarde

Niet-type templateparameters kunnen worden gespecialiseerd op specifieke waarden, wat nuttig is voor tabellen die tijdens het compileren worden opgebouwd.

#include <iostream>

template <int N>
struct Fib { static const int value = Fib<N-1>::value + Fib<N-2>::value; };

template <>
struct Fib<0> { static const int value = 0; };

template <>
struct Fib<1> { static const int value = 1; };

int main() {
    std::cout << Fib<10>::value << '\n';
    return 0;
}

Gedrag consistent houden

Een specialisatie moet hetzelfde conceptuele contract behouden als het primaire template; alleen de implementatie verandert. Anders worden aanroepers verrast.

#include <iostream>

template <typename T>
T zero() { return T{}; }

template <>
int zero<int>() { return 0; }

int main() {
    std::cout << zero<int>() << ' ' << zero<double>() << '\n';
    return 0;
}

Korte controle

Test je begrip van de syntaxis voor volledige specialisatie.

Samenvatting

Je hebt geleerd over volledige specialisatie:

  • levert een specifieke implementatie voor één exact type
  • wordt geschreven met template <> en het concrete type
  • de compiler geeft altijd de voorkeur aan een exacte specialisatie
  • werkt voor functies, klassen, afzonderlijke leden en specifieke waarden

Vervolgens zie je gedeeltelijke specialisatie, die patronen van typen herkent.

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 “Volledige specialisatie” gratis?

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

Pas templates aan voor een type 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 1 van 4.

Hoe lang duurt de les “Volledige specialisatie”?

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. Volledige specialisatie
  2. Gedeeltelijke specialisatie
  3. SFINAE
  4. Patronen met enable_if
← Terug naar C++ Academy