Templates in C++ und generische Programmierung in C
In dieser Lektion schreibst du mit Templates in C++ eine Funktion für mehrere Datentypen und vergleichst sie mit _Generic aus C11.
Einführung
Mit Templates schreibst du eine allgemeine Codevorlage, aus der der Compiler für jeden Datentyp die passende Version erzeugt und dabei die Typsicherheit wahrt. In C verwenden Programmierer für einen ähnlichen Zweck meist Makros, void-Zeiger oder das Schlüsselwort _Generic aus C11.
Wichtige Punkte
- Verstehe zuerst, wie es in C funktioniert, bevor du die Abstraktionen von C++ lernst.
- Drücke den Besitz von Ressourcen mit RAII und Wertsemantik (value semantics) aus.
- Bevorzuge die typsicheren Werkzeuge von C++ gegenüber Makros und Typumwandlungen.
Codebeispiele in C und C++
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
C und C++ im Vergleich
In C wählt das Makro MAX mit _Generic je nach Argumenttyp max_int oder max_double aus, dafür müssen aber alle unterstützten Typen vorab aufgezählt werden. In C++ funktioniert das Template maximum mit jedem Typ, der den Vergleich > unterstützt, ohne die Funktion für jeden Typ neu zu schreiben.
C verwendet Namenskonventionen, Callbacks, Makros und structs mit Kontext.
C++ bietet Abstraktionen mit klarem Gültigkeitsbereich, die typsicher sind und zur Laufzeit meist nichts zusätzlich kosten.
Übungen zur Vertiefung
Führe beide Versionen aus und ändere dann den Code, um zu beobachten, welche Sicherheit jede Sprache bietet.
- Schreibe den Mechanismus zuerst in C und verwende erst dann die entsprechende C++-Funktion.
- Ersetze das manuelle Freigeben von Ressourcen durch RAII.
- Prüfe, ob die Funktion Speicherreservierungen oder Aufrufe virtueller Funktionen verursacht.
Mit einer Challenge üben
Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.
- Array Maximum Finde den größten Wert in einer Liste. Einfach
- Min-Stack Baue einen Stack, der nach jedem Push oder Pop sofort sein kleinstes Element meldet. Mittel