C++ Class Templates Beheersen: Een Praktische Gids
C++ Class Templates Beheersen: Een Praktische Gids
Leer hoe je C++ class templates kunt benutten om flexibele, type-agnostische code te schrijven met duidelijke, real-world voorbeelden.
Templates zijn een hoeksteen van generiek programmeren in C++. Ze laten je herbruikbare componenten creëren die met elk datatype werken, wat de codehelderheid verbetert en duplicatie vermindert. C++ biedt twee soorten templates: functie templates en class templates.
- Functie Templates
- Class Templates
Class templates stellen je in staat om een enkele klasse te definiëren die zich aanpast aan meerdere datatypes. Dit verkort niet alleen je code, maar maakt het ook makkelijker te onderhouden.
Een Class Template Declareren
Een class template begint met het template sleutelwoord, gevolgd door een lijst van template parameters tussen haakjes. Daarna volgt de echte klassedefinitie.
template <class T> class MyClass { private: T var; public: T getVar() const; };
Hier is T een placeholder voor het datatype dat geleverd wordt wanneer de template geïnstantieerd wordt. Het sleutelwoord class kan vervangen worden door typename zonder de semantiek te veranderen.
Een Class Template Instantiëren
Eenmaal een template gedefinieerd, kun je objecten creëren door het gewenste type te specificeren:
MyClass<int> intObj; MyClass<float> floatObj; MyClass<std::string> stringObj;
Elke instantiatie genereert een concrete klasse afgestemd op het gespecificeerde type tijdens compilatie.
Voorbeeld 1: Generieke Number Wrapper
#include <iostream> using namespace std; // Class template die een enkele waarde van elk type opslaat template <class T> class Number { private: T value; public: Number(T v) : value(v) {} T getValue() const { return value; } }; int main() { Number<int> intNum(7); Number<double> doubleNum(7.7); cout << "int Number = " << intNum.getValue() << endl; cout << "double Number = " << doubleNum.getValue() << endl; return 0; }
Output
int Number = 7 double Number = 7.7
Let op dat de template parameter T gebruikt wordt voor het lidvariabele, constructorargument en return type, wat de klasse in staat stelt om met elk type te werken.
Leden Definiëren Buiten de Klasse
Wanneer een lidfunctie groot is of gedeeld over specialisaties, kun je het buiten de klassebody definiëren:
template <class T> class Sample { public: T identity(); }; // Buiten-definitie template <class T> T Sample<T>::identity() { return static_cast<T>(1); }
Let op de herhaling van de template<class T> declaratie voor de buiten-definitie.
Voorbeeld 2: Calculator met Class Templates
#include <iostream> using namespace std; template <class T> class Calculator { private: T a, b; public: Calculator(T x, T y) : a(x), b(y) {} T add() const { return a + b; } T subtract() const { return a - b; } T multiply() const { return a * b; } T divide() const { return a / b; } void display() const { cout << "a: " << a << ", b: " << b << endl; cout << "a + b = " << add() << endl; cout << "a - b = " << subtract() << endl; cout << "a * b = " << multiply() << endl; cout << "a / b = " << divide() << endl; } }; int main() { Calculator<int> intCalc(2, 1); Calculator<float> floatCalc(2.4f, 1.2f); cout << "Int resultaten:\n"; intCalc.display(); cout << "\nFloat resultaten:\n"; floatCalc.display(); return 0; }
Output
Int resultaten: a: 2, b: 1 a + b = 3 a - b = 1 a * b = 2 a / b = 2 Float resultaten: a: 2.4, b: 1.2 a + b = 3.6 a - b = 1.2 a * b = 2.88 a / b = 2
Templates met Meerdere Parameters
Class templates kunnen meer dan één parameter accepteren, en je kunt zelfs standaardtypen opgeven:
template <class T, class U, class V = int> class MultiParam { T first; U second; V third; };
Voorbeeld 3: Multi-Parameter Template
#include <iostream> using namespace std; template <class T, class U, class V = char> class ClassTemplate { private: T var1; U var2; V var3; public: ClassTemplate(T v1, U v2, V v3) : var1(v1), var2(v2), var3(v3) {} void print() const { cout << "var1 = " << var1 << endl; cout << "var2 = " << var2 << endl; cout << "var3 = " << var3 << endl; } }; int main() { ClassTemplate<int, double> obj1(7, 7.7, 'c'); cout << "obj1 waarden:\n"; obj1.print(); ClassTemplate<double, char, bool> obj2(8.8, 'a', false); cout << "\nobj2 waarden:\n"; obj2.print(); return 0; }
Output
obj1 waarden: var1 = 7 var2 = 7.7 var3 = c obj2 waarden: var1 = 8.8 var2 = a var3 = 0
In dit voorbeeld is de derde template parameter standaard char, maar kan overschreven worden zoals getoond met bool in obj2.
C Taal
- C# Static Keyword: Static Variabelen, Methodes en Classes Beheersen
- C# Geneste Classes: Definitie, Gebruik en Inheritance
- C++ operators: complete gids met praktische voorbeelden
- C++ comments: best practices voor leesbare, onderhoudbare code
- Storage Classes in C++ Begrijpen: Scope, Levensduur en Gebruik
- Polymorfisme in C++ Begrijpen: Een Praktische Gids
- Data Abstractie in C++ Beheersen: Ontwerp Vereenvoudigen met Interface-Implementatie Scheiding
- Data Encapsulatie in C++: Uw Code Beschermen
- C++ Interfaces: Abstracte Klassen & Pure Virtual Functions Beheersen
- C++ Templates Beheersen: Gids voor Generisch Programmeren
- C# Erfelijkheid Beheersen: Herbruikbare, Onderhoudbare Code Bouwen