kennen:concepts
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:concepts [2020-07-12 12:25] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Concepts ====== | ||
+ | > God is a concept by which we measure our pain. | ||
+ | >> | ||
+ | Generische Lambdas mit '' | ||
+ | <code cpp> | ||
+ | auto show = [](auto x) { std::cout << x << ' | ||
+ | </ | ||
+ | und generische Funktionen mit '' | ||
+ | <code cpp> | ||
+ | void show(auto x) { std::cout << x << ' | ||
+ | auto add(auto x, auto y) { return x + y; } // operator+ erforderlich | ||
+ | </ | ||
+ | entsprechen Schablonen: | ||
+ | <code cpp> | ||
+ | template < | ||
+ | void show(T x) { std::cout << x << ' | ||
+ | </ | ||
+ | Was geschieht, wenn einige Operationen für die Parametertypen nicht definiert sind? | ||
+ | Vom Compiler erzeugte Fehlermeldungen sind nicht immer verständlich, | ||
+ | |||
+ | ===== Anforderungen ===== | ||
+ | sind Prädikate, die beim Übersetzen ausgewertet werden. Sie beschränken Schablonen | ||
+ | |||
+ | <code cpp> | ||
+ | template < | ||
+ | requires std:: | ||
+ | T add(T x, T y) { return x+y; } | ||
+ | </ | ||
+ | |||
+ | Die Anforderungen können auch nach der Parameterliste angegeben werden. Mit einem '' | ||
+ | <code cpp> | ||
+ | template < | ||
+ | concept Number = std:: | ||
+ | </ | ||
+ | wird das Beispiel zu | ||
+ | <code cpp> | ||
+ | template < | ||
+ | requires Number< | ||
+ | T add(T x, T y) { return x+y; } | ||
+ | </ | ||
+ | |||
+ | Neben der Form mit der '' | ||
+ | |||
+ | ==== Shorthand notation ==== | ||
+ | nutzt '' | ||
+ | |||
+ | <code cpp> | ||
+ | template <Number T> | ||
+ | T add(T x, T y) { return x+y; } | ||
+ | </ | ||
+ | |||
+ | ==== Terse syntax ==== | ||
+ | |||
+ | war sehr umstritten. | ||
+ | Daher verpassten Concepts den Einzug in [[kennen: | ||
+ | Sie sind nun Bestandteil von [[kennen: | ||
+ | |||
+ | <code cpp> | ||
+ | Number auto add(Number auto x, Number auto y) { return x+y; } | ||
+ | </ | ||
+ | hat eine etwas andere Bedeutung als im Beispiel oben. | ||
+ | Unterschiedliche Parametertypen sind möglich. | ||
+ | Jeder Parametertyp ist unabhängig von dem anderen beschränkt. | ||
+ | Der Ergebnistyp kann wiederum ein anderer sein, sofern er die Anforderung von '' | ||
+ | Jetzt ist es auch möglich, Anforderungen an '' | ||
+ | <code cpp> | ||
+ | Number auto x = add(1, 2); | ||
+ | Number auto y = add(1, 3.14); | ||
+ | Number auto z = add(1, " | ||
+ | Number auto s = " | ||
+ | </ | ||
+ | |||
+ | ===== Concepts definieren ===== | ||
+ | Anforderungen können logisch verknüpft werden (siehe '' | ||
+ | Innerhalb eines '' | ||
+ | |||
+ | * einfache Anforderungen wie '' | ||
+ | * Typanforderungen wie '' | ||
+ | * zusammengesetzte Anforderungen möglich, die auch den Ergebnistyp einer Operation einschränken: | ||
+ | |||
+ | <code cpp> | ||
+ | template< | ||
+ | concept LessThanComparable = requires(T t) | ||
+ | { | ||
+ | { t<t } -> std:: | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | Die Standardbibliothek definiert grundlegende Anforderungen in [[kennen: |
kennen/concepts.txt · Zuletzt geändert: 2020-07-12 12:25 von 127.0.0.1