Generics in C++: Was sind Templates und wie man sie als Anfänger verwendet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Generics in C++: Wozu sie dienen und wie man sie verwendet



Hallo, Freund! Wenn du gerade anfängst, C++ zu lernen, und bereits auf den Begriff Generics (oder Templates) gestoßen bist, dann ist dieser Artikel für dich. Viele Anfänger haben Angst vor Templates und halten sie für etwas Kompliziertes und Magisches. In Wirklichkeit ist alles viel einfacher. Lass uns herausfinden, was das ist, wozu sie dienen und wie man sie in der Praxis anwendet.



Was sind Generics (Templates) in C++?



Stell dir vor, du musst eine Funktion schreiben, die zwei Zahlen addiert. Du schreibst eine Funktion für int, eine andere für double, eine dritte für float … Gib zu, das ist mühsam und verstößt gegen das Prinzip DRY (Don't Repeat Yourself).



Hier kommen Templates zur Hilfe. Dies ist ein Mechanismus, der es ermöglicht, generischen Code zu schreiben, der mit beliebigen Datentypen funktioniert. In C++ ist dies das Äquivalent zu dem, was in anderen Sprachen Generics genannt wird (z. B. in Java oder C#).



Ein Template ist keine konkrete Funktion oder Klasse, sondern eine "Vorlage" oder ein "Rezept". Der Compiler erstellt, wenn er sieht, dass du ein Template mit dem Typ int verwendest, eine Version des Codes für int. Wenn du es mit double verwendest, erstellt der Compiler eine Version für double. Dies nennt man Template-Instantiierung.



Wozu dienen Templates? Drei Hauptgründe



1. Wiederverwendung von Code

Anstatt 10 Funktionen für verschiedene Zahlentypen zu schreiben, schreibst du eine universelle. Das spart Zeit, reduziert die Anzahl der Fehler und macht den Code lesbarer.



2. Typsicherheit

Im Gegensatz zu Makros (#define) oder der Verwendung von void* werden Templates vom Compiler überprüft. Wenn du versuchst, einen ungeeigneten Typ an ein Template zu übergeben, gibt der Compiler einen Fehler während der Kompilierung aus, nicht während der Programmausführung.



3. Leistung

Templates verursachen keine Laufzeit-Overhead. Der Compiler erstellt optimierten Code für jeden spezifischen Typ, und dieser Code arbeitet genauso schnell, als hättest du ihn manuell geschrieben.



Wie man Templates verwendet: Syntax und Beispiele



Betrachten wir zwei Hauptarten von Templates: Funktions-Templates und Klassen-Templates.



Funktions-Templates

Das einfachste Beispiel ist eine Funktion, die den Maximalwert von zwei Werten ermittelt.



#include <iostream>#include <string>

// Deklaration eines Funktions-Templatestemplate <typename T>T max_value(T a, T b) { return (a > b) ? a : b;}

int main() { // Funktioniert mit int std::cout << max_value(10, 20) << std::endl; // Ausgabe: 20 // Funktioniert mit double std::cout << max_value(3.14, 2.71) << std::endl; // Ausgabe: 3.14 // Funktioniert mit Strings std::cout << max_value(std::string("apple"), std::string("banana")) << std::endl; // Ausgabe: banana return 0;}


Das Schlüsselwort template sagt dem Compiler: "Achtung, es folgt ein Template". <typename T> ist die Liste der Template-Parameter. T ist ein Platzhaltername für den Typ, der beim Aufruf der Funktion durch den tatsächlichen Typ ersetzt wird. Anstelle von typename kann auch class verwendet werden – es gibt keinen Unterschied.



Wichtig: Der Compiler errät selbst, welchen Typ du meinst, basierend auf den übergebenen Argumenten. Dies nennt man Template-Argument-Deduktion. Du kannst den Typ aber auch explizit angeben:



std::cout << max_value<double>(10, 20.5) << std::endl; // Explizite Angabe des Typs double


Klassen-Templates

Klassen-Templates ermöglichen die Erstellung universeller Datencontainer. Ein klassisches Beispiel ist ein einfaches Äquivalent zu std::pair.



#include <iostream>#include <string>

// Template

Blogs

Buchempfehlungen