lang:cpp:concept
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| lang:cpp:concept [2020/02/10 13:09] – Meilleur exemple sur les fonctions root | lang:cpp:concept [2021/11/13 09:04] (Version actuelle) – Ajout de "Restriction" "Fonction template" root | ||
|---|---|---|---|
| Ligne 17: | Ligne 17: | ||
| template < | template < | ||
| // Le type est cv. Donc, il faut utiliser deux paramètres, | // Le type est cv. Donc, il faut utiliser deux paramètres, | ||
| - | concept Shape = requires(const T t, T u) | + | concept Shape = requires(const T t, T u, float f) |
| { | { | ||
| - | // Le type de retour est faculatif | + | // Le type de retour est facultatif |
| - | { t.area() } -> float; | + | { t.area() } -> std:: |
| - | { u.mod() } -> float; | + | { u.mod(f) } -> std:: |
| - | // On impose une variable. Elle peut être static / constexpr ou non. | + | // On impose une variable. |
| - | { t.varr } -> float; | + | // Elle peut être static / constexpr ou non. |
| + | // Il faut la déclarer comme une référence. | ||
| + | { t.varr } -> std:: | ||
| }; | }; | ||
| </ | </ | ||
| Ligne 33: | Ligne 35: | ||
| { | { | ||
| consteval float area() const {return 1.;} | consteval float area() const {return 1.;} | ||
| - | consteval float mod() {return | + | consteval float mod(float f) {return |
| static constexpr float varr = 2.f; | static constexpr float varr = 2.f; | ||
| }; | }; | ||
| Ligne 59: | Ligne 61: | ||
| b.mod(); | b.mod(); | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | * Déclaration d'une fonction dont un des paramètres doit respecter un concept | ||
| + | |||
| + | <code cpp> | ||
| + | void foo(const Concept auto&) | ||
| + | {} | ||
| + | </ | ||
| + | |||
| + | Et cela va générer un symbole pour chaque type. | ||
| + | |||
| + | ====Restriction==== | ||
| + | |||
| + | ===Fonction template=== | ||
| + | |||
| + | Il n'est pas possible de définir un concept avec un template non défini dans le concept. | ||
| + | |||
| + | Exemple: | ||
| + | |||
| + | <code cpp> | ||
| + | struct Goat { | ||
| + | template< | ||
| + | void eat(T); | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | Il n'est pas possible de laisser '' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ====Migration C++17 vers C++20==== | ||
| + | |||
| + | * Code C++17 | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | |||
| + | template < | ||
| + | concept bool IShape = requires (T x, T z, int y) | ||
| + | { | ||
| + | { T() } ; | ||
| + | { x = z } -> T&; | ||
| + | { T(x) } ; | ||
| + | { x.countSides() } -> int; | ||
| + | { x.sideLength(y) } -> int; | ||
| + | }; | ||
| + | |||
| + | struct Rectangle | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | const char * getName() { return " | ||
| + | int countSides() {return 4;} | ||
| + | int sideLength(int side) { return (side % 2 == 0) ? 10 : 5; } | ||
| + | }; | ||
| + | |||
| + | struct Square | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | const char * getName() { return " | ||
| + | int countSides() {return 4;} | ||
| + | int sideLength(int side) { return 10; } | ||
| + | }; | ||
| + | |||
| + | void print(IShape& | ||
| + | { | ||
| + | for (int side = 0 ; side < shape.countSides() ; ++side ) | ||
| + | { | ||
| + | //std::cout << shape.getName() << " side=" << shape.sideLength(side) << " | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | | ||
| + | | ||
| + | auto shapes = std:: | ||
| + | | ||
| + | |||
| + | | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | * Code C++20 | ||
| + | |||
| + | <code cpp> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | template < | ||
| + | concept IShape = requires (T x, T z, int y) | ||
| + | { | ||
| + | { T() } ; | ||
| + | { x = z } -> std:: | ||
| + | { T(x) } ; | ||
| + | { x.countSides() } -> std:: | ||
| + | { x.sideLength(y) } -> std:: | ||
| + | }; | ||
| + | |||
| + | struct Rectangle | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | const char * getName() { return " | ||
| + | int countSides() {return 4;} | ||
| + | int sideLength(int side) { return (side % 2 == 0) ? 10 : 5; } | ||
| + | }; | ||
| + | |||
| + | struct Square | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | const char * getName() { return " | ||
| + | int countSides() {return 4;} | ||
| + | int sideLength(int side) { return 10; } | ||
| + | }; | ||
| + | |||
| + | void print(IShape auto& shape) | ||
| + | { | ||
| + | for (int side = 0 ; side < shape.countSides() ; ++side ) | ||
| + | { | ||
| + | //std::cout << shape.getName() << " side=" << shape.sideLength(side) << " | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | | ||
| + | | ||
| + | auto shapes = std:: | ||
| + | | ||
| + | |||
| + | | ||
| + | }; | ||
| </ | </ | ||
lang/cpp/concept.1581336555.txt.gz · Dernière modification : de root
