C++
VeröffentlichtRevision 1

Templates, Typvorlagen und Concepts

Ein Template ist eine Vorlage für Funktionen oder Typen. Generische Programmierung formuliert Code anhand benötigter Eigenschaften, statt ihn nur auf einen konkreten Typ festzulegen. std::vector<int> und std::vector<double> sind dir bereits als Anwendungen begegnet.

Templates, Typvorlagen und Concepts#

Modernes C++ · Lektion 43 von 60

Voraussetzungen: Funktionen, Klassen. Lernziel: Du schreibst eine Berechnung für mehrere passende Typen.

Ein Template ist eine Vorlage für Funktionen oder Typen. Generische Programmierung formuliert Code anhand benötigter Eigenschaften, statt ihn nur auf einen konkreten Typ festzulegen. std::vector<int> und std::vector<double> sind dir bereits als Anwendungen begegnet.

C++
1#include <iostream>2 3template <typename T>4T groesser(T links, T rechts) {5    return links < rechts ? rechts : links;6}7 8int main() {9    std::cout << groesser(3, 7) << '\n';10    std::cout << groesser(2.5, 1.0) << '\n';11}

T ist ein Typparameter, ein Platzhalter für einen Typ. typename kennzeichnet das. Der Compiler erzeugt bei benötigter Verwendung eine passende Instanziierung, also eine konkrete Ausprägung der Vorlage. Hier arbeitet eine Variante mit int, die andere mit double.

Anforderungen bleiben real#

Das Template benötigt unter anderem einen gültigen Vergleich mit < und passende Rückgabewerte. Eine Vorlage ist nicht automatisch für jeden Typ sinnvoll. Bei groesser(3, 2.5) leitet derselbe Parameter T widersprüchliche Typen ab. Schreibe bewusst passende Werte oder beispielsweise groesser<double>(3, 2.5).

Lange Templatefehlermeldungen zeigen oft mehrere Ebenen: die ursprüngliche Aufrufstelle, die instanziierte Vorlage und die tatsächlich nicht unterstützte Operation. Suche zuerst nach dem eigenen Aufruf und anschließend nach der ersten konkreten Typverletzung.

Sichtbare Definitionen#

Template-Definitionen müssen bei der üblichen impliziten Instanziierung sichtbar sein. Deshalb stehen sie häufig vollständig in Headern. Nur die Deklaration in einen Header und die Definition in eine gewöhnliche .cpp-Datei zu verschieben führt ohne zusätzliche ausdrückliche Instanziierung oft zu Linkerproblemen.

Concepts ab C++20#

Ein Concept ist eine benannte Anforderung an Typen. Es kann ausdrücken, dass ein Template nur mit geeigneten Typen benutzt werden soll. Das folgende eigenständige Beispiel benötigt C++20:

C++
1#include <concepts>2#include <iostream>3 4template <std::integral T>5bool istGerade(T wert) {6    return wert % 2 == 0;7}8 9int main() {10    std::cout << std::boolalpha << istGerade(8) << '\n';11}

std::integral beschreibt Ganzzahltypen. Ein Aufruf mit 2.5 erfüllt diese Anforderung nicht. Concepts verbessern die Schnittstelle und oft die Diagnose; sie beweisen keine vollständige fachliche Korrektheit.

Übung#

Warum ist T kein zur Laufzeit frei wechselnder Datentyp?

Lösung

Die konkrete Instanziierung besitzt festgelegte Typen. Die Vorlage wird beim Übersetzen passend verwendet; sie schaltet nicht innerhalb desselben Objekts beliebig zwischen Typen um.

Weiterlernen#

Zurück: Vererbung, virtuelle Funktionen und Komposition · Kursübersicht · Weiter: Lambdas und bewusstes Einfangen von Werten

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.