C++20-Konzepte: Robusterer generischer Code mit Konzepten

Concepts sind eine Neuerung in C++20. Teil 1 der zweiteiligen Artikelserie stellt ihre Grundelemente vor: Mit ihnen lassen sich Anforderungen definieren.

Lesezeit: 13 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 131 Beiträge
C++20-Konzepte: Robusterer generischer Code mit Konzepten

(Bild: RHJPhtotoandilustration/Shutterstock.com)

Von
  • Andreas Fertig
Inhaltsverzeichnis

C++-Entwicklerinnen und -Entwickler können mit Konzepten Anforderungen (Requirements) beziehungsweise Einschränkungen (Constraints) für einen Datentyp formulieren. Etwas Vergleichbares gab es bereits vor C++20 in Form von enable_if. Diese Variante ist im Vergleich zu Konzepten allerdings ein einfaches Mittel, das mit der Mächtigkeit von Konzepten nicht mithalten kann, die bereits für C++11 geplant waren, dann aber noch vor der Finalisierung des Standards entfernt wurden.

Ein Konzept in C++ besteht aus einem Namen, mit dem es angesprochen wird, und einer oder mehreren Einschränkungen. Um ein Konzept formulieren zu können, bietet C++20 zwei neue Schlüsselwörter: concept und requires (s. Abb. 1).

Die einzelnen Elemente einer Konzeptdefinition (Abb. 1)

Da ein Konzept immer für generischen Code existiert, beginnt es mit einem Template-Kopf wie bei Funktions- oder Klassen-Templates. Danach leitet das Schlüsselwort concept das Konzept selbst ein und vergibt einen Namen wie bei einer Variablen. In diesem Fall lautet er MyConcept. Auf der rechten Seite des Gleichheitszeichens stehen die Einschränkungen, die dem Konzept zugewiesen werden. Sie können mittels boolescher Ausdrücke verknüpft werden. Im hier gezeigten Beispiel müssen die beiden Datentypen T und U dem gleichen Datentyp angehören. Das Konzept same_as prüft das. Außerdem muss T entweder ein Klassen- oder ein enum-Datentyp sein. Hier kommen die booleschen Verknüpfungen && oder || zum Einsatz. Die beiden Type Traits is_class_v und is_enum_v, die bereits vor C++20 existierten, prüfen die weiteren Einschränkungen.

Damit steht das Grundgerüst von Konzepten. Die Definition von eigenen Konzepten ist durch die Einleitung mit dem Schlüsselwort concept und durch das Zuweisen von Einschränkungen möglich. Die Standardbibliothek von C++20 bringt bereits über 30 vordefinierte Konzepte mit.

Konzepte beziehungsweise Einschränkungen sind in fünf verschiedenen Bereichen einsetzbar (s. Abb. 2).

Hilfreich ist die in der Abbildung gezeigten Form C1, denn das Konzept C1 ersetzt typename oder class. Allein ein gut gewählter Konzeptname schafft bereits sehr viel mehr Klarheit. Während sich hinter typename ein beliebiger Template Type verbirgt, kann der Name eines Konzepts mitteilen, dass dieses Funktions-Template beispielsweise ein std::invocable erfordert. Der Name gibt also einen Hinweis, dass der Datentyp ausführbar und somit eine Funktion, ein Lambda oder ein Callable sein muss. Wer Wert auf Clean Code legt, findet darin noch einmal einen "Turbo", unabhängig von all dem, was Concepts sonst noch leisten.