kennen:coroutine
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:coroutine [2020-07-13 15:43] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Coroutinen ====== | ||
+ | Coroutinen enthalten eines der Schlüsselwörter [[.: | ||
+ | |||
+ | Funktionen berechnen einen Wert und geben ihn zurück. | ||
+ | Coroutinen können einen Wert liefern (yield), ihre Arbeit unterbrechen (suspend) und weiterarbeiten (resume), wo sie pausiert haben. | ||
+ | |||
+ | ===== Beispiel ===== | ||
+ | |||
+ | <code cpp coro_pythagorean.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | using Triple = std:: | ||
+ | using namespace std:: | ||
+ | |||
+ | generator< | ||
+ | { | ||
+ | for (auto z = 1; z < limit; ++z) | ||
+ | for (auto y = 1; y < z; ++y) | ||
+ | for (auto x = 1; x < y; ++x) | ||
+ | if (x * x + y * y == z * z) | ||
+ | { | ||
+ | std::cout << ' | ||
+ | co_yield {x, y, z}; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | generator< | ||
+ | { | ||
+ | for (auto [x, y, z] : pythagorean_triples(limit)) | ||
+ | if (std:: | ||
+ | co_yield {x, y, z}; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | std::cout << " | ||
+ | |||
+ | for (auto [x, y, z] : irreducible_pythagorean_triples(30)) | ||
+ | std::cout << x << ' ' << y << ' ' << z << ' | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Die Ausgabe zeigt, wie die Coroutinen interagieren: | ||
+ | |||
+ | < | ||
+ | pythagorean triple | ||
+ | irreducible | ||
+ | 3 4 5 | ||
+ | 3 4 5 | ||
+ | 6 8 10 | ||
+ | 5 12 13 | ||
+ | 5 12 13 | ||
+ | 9 12 15 | ||
+ | 8 15 17 | ||
+ | 8 15 17 | ||
+ | 12 16 20 | ||
+ | 15 20 25 | ||
+ | 7 24 25 | ||
+ | 7 24 25 | ||
+ | 10 24 26 | ||
+ | 20 21 29 | ||
+ | 20 21 29 | ||
+ | </ |