Und der Gewinner ist: Templates
Die Zukunft von C++ spricht Templates und so auch mein Blog Modernes C++. Basierend auf der Umfrage meines letzten Beitrags "Quo Vadis - Modernes C++", erklÀren meine nÀchsten wohl 50 - 100 Artikel die Details zu Templates. In diesem Artikel möchte ich einen Ausblick geben.
Die Zukunft von C++ spricht Templates und so auch mein Blog Modernes C++. Basierend auf der Umfrage meines letzten Beitrags "Quo Vadis - Modernes C++ [1]", erklÀren meine nÀchsten wohl 50 - 100 Artikel die Details zu Templates. In diesem Artikel möchte ich einen Ausblick geben.
Lasst mich zunĂ€chst ein paar Worte zu der Umfrage schreiben, denn ihr Ergebnis hat mich in zweierlei Hinsicht ĂŒberrascht.
Die Umfrage
Erstens nahmen nahezu 400 Personen an der Umfrage teil. Das ist eine Zahl, die ich so nicht erwartet hĂ€tte. Vielen Dank fĂŒr die vielen Stimmen.
Zweitens bin ich davon ausgegangen, dass "C++23" die Umfrage gewinnen wird, gefolgt von "Templates" oder "Erweitern und Einbetten von Python mit C/C++". Meine Annahme war so falsch. Ich bin froh, dass ich die Umfrage gemacht habe.
Wenn ich mit dem Themenkomplex "Templates" fertig bin, fĂŒhre ich die nĂ€chste Umfrage durch. Jetzt möchte ich mich aber den Templates widmen.
Templates
Zuallererst: Was sind Templates? Templates (Klassen-Templates oder Funktions-Templates) sind Familien von Klassen oder Funktionen.
Bevor ich meinen Plan vorstelle, möchte ich ein paar Worte loswerden. Falls ich ein Template-bezogenes Feature vergessen habe, an dem ihr interesssiert seid, schreibt mir bitte eine E-Mail an folgende Adresse: Rainer.Grimm@modernescpp.de [2].
Das sind die zukĂŒnftigen Themen mit ein paar erlĂ€uternden Worten.
Grundlagen
NatĂŒrlich beginnt meine Tour mit den Grundlagen.
- Die Vorstellung der Instanziierung von Funktions-Templates vermittelt die erste Intuition zu Templates. Dies gilt insbesondere, wenn FunktionsĂŒberladungen oder explizite Template-Argumente angegeben werden.
- Im Gegensatz zu Funktions-Template kann nur der C++17-Compiler die Template-Argumente fĂŒr Klassen-Templates bestimmen. Das heiĂt, vor C++17 mussten Entwickler Template-Argumente wie
intinstd::vector<int>angeben. - Template-Parameter können Typen, Nicht-Typen und Templates selbst sein. Insbesondere können in C++20 FlieĂkommazahlen als Nicht-Typ Template-Parameter verwendet werden.
- Der Compiler kann die Template-Argumente automatisch bestimmen. Es macht dabei einen groĂen Unterschied, ob der Template-Parameter eine Referenz/Zeiger, eine universelle Referenz (
&&) oder ein Wert ist. Templates können auch Default-Template-Argumente besitzen. - Klassen-Templates erlauben teilweise und vollstÀndige Template-Spezialisierung, Funktions-Templates dagegen nur vollstÀndige Template-Spezialisierung.
Details
Nach den Grundlagen folgen die Details.
- Im Allgemeinen geschieht die Instanziierung von Templates implizit, sie kann aber auch explizit erfolgen.
- Ein Variadic-Template ist ein Template, das eine beliebige Anzahl von Parametern haben kann. Damit können Templates eine beliebige Anzahl von Argumenten einer beliebigen Wertkategorie annehmen.
- Basierend auf Variadic-Templates in C++11 kennt C++17 Fold-AusdrĂŒcke. Sie reduzieren Parameterpakete auf binĂ€re Operatoren.
- Eine Besonderheit ist die Freundschaft von Templates. Eine Klasse oder Klassen-Template kann jeder Instanz eines Klassen-Templates oder Funktions-Templates allgemeine Freundschaft aussprechen. Die Freundschaft kann auch nur bestimmten Instanzen eine Klassen-Templates oder Funktions-Templates gewÀhrt werden, und auch einem bestimmten Datentyp.
- Namen können von Template-Parametern abhÀngig sein. Bei abhÀngigen Namen benötigt der Compiler Hilfe, um zu entscheiden, ob der Name ein Typ, ein Nichttyp oder ein Template ist. Bei Mehrdeutigkeit geht der Compiler davon aus, dass ein Name ein Nichttyp ist.
Techniken
Es gibt viele interessante Techniken und Feature im Zusammenhang mit Template und der Template Instanziierung.
- Wenn ein Funktions-Template mit mindestens zwei Template-Parametern zum Einsatz kommt, lĂ€sst es sich im Allgemeinen nicht entscheiden, welchen RĂŒckgabetyp das Funktions-Template besitzen soll. Hier leistet der automatische RĂŒckgabetyp wertvolle Hilfe.
- Template-Metaprogrammierung ist Turing-vollstÀndig [3]. Das bedeutet, dass alles, was berechenbar ist, sich zur Compilezeit berechnen lÀsst. Template-Metaprogrammierung ist eine rein funktionale Sprache, eingebettet in die imperative Sprache C++. Libraries wie viele der Boost-Bibliotheken [4]setzen intensiv Template-Metaprogrammierung ein.
- Die Type-Traits Bibliothek stellt angewandte Template-Metaprogrammierung dar. Dank der Type-Traits Bibiliothek sind TypprĂŒfungen, Typvergleiche und TypĂ€nderungen zur Compilezeit möglich.
constexprist die angenehmste Art, zur Compilezeit zu programmieren. Im Gegensatz zum Programmieren im funktionalen Stil mit Template-Metaprogrammierung, erlaubtconstexprdas Programmieren im imperativen Stil.constexpr ifermöglicht es, Quellcode bedingt zu kompilieren.
Design
Templates eröffnet C++ neue Möglichkeiten, Software zu entwerfen.
- Neben dem dynamischen Polymorphismus (Objektorientierung) können wir den statischen Polymorphismus (Templates) einsetzen.
- CRTP (curiously recurring template pattern) ist eine verblĂŒffende, aber sehr mĂ€chtige Technik. Dank ihr können wir die VirtualitĂ€t von der Runtime auf die Compilezeit verlagern.
- Expression-Templates erzeugen Strukturen, die fĂŒr Berechnungen stehen. Sie werden nur bei Bedarf ausgewertet und sparen somit Zeit und Speicher.
- Es gibt viele Idiome und Pattern im Zusammenhang mit Templates. Zum Beispiel kennen wir Policies und Traits, Tag-Dispatching und Type Erasure.
C++20
- Der englische Wikipedia-Eintrag beschreibt Concepts [5] folgendermaĂen: Concepts are an extension to the templates [6] feature provided by the C++ [7] programming language. Concepts are named Boolean [8] predicates on template parameters, evaluated at compile time [9]. A concept may be associated with a template (class [10] template, function [11] template, or member function [12] of a class template), in which case it serves as a constraint: it limits the set of arguments that are accepted as template parameters
Wie geht's weiter?
In meinem nĂ€chsten Artikel werde ich Templates einfĂŒhren und dabei C++ Insights [13] verwenden. ( [14])
URL dieses Artikels:
https://www.heise.de/-6027028
Links in diesem Artikel:
[1] https://heise.de/-6018689
[2] mailto:Rainer.Grimm@modernescpp.de
[3] https://de.wikipedia.org/wiki/Turing-Vollst%C3%A4ndigkeit
[4] https://www.boost.org/
[5] https://en.wikipedia.org/wiki/Concepts_(C%2B%2B)
[6] https://en.wikipedia.org/wiki/Template_(C%2B%2B)
[7] https://en.wikipedia.org/wiki/C%2B%2B
[8] https://en.wikipedia.org/wiki/Boolean_value
[9] https://en.wikipedia.org/wiki/Compile_time
[10] https://en.wikipedia.org/wiki/Class_(C%2B%2B)
[11] https://en.wikipedia.org/wiki/Function_(computer_programming)
[12] https://en.wikipedia.org/wiki/Member_function
[13] https://cppinsights.io/
[14] mailto:rainer@grimm-jaud.de
Copyright © 2021 Heise Medien