Reaktive Programmierung in C++: Bibliotheken und Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Reaktive Programmierung in C++: Ein moderner Ansatz zur Ereignisverarbeitung

\n\n

Reaktive Programmierung (Reactive Programming) ist ein Paradigma, das sich auf asynchrone Datenströme und die Verbreitung von Änderungen konzentriert. In C++ ermöglicht dieses Konzept den Bau flexibler, reaktionsschneller und leicht wartbarer Anwendungen, insbesondere in den Bereichen GUI, Netzwerkkommunikation und Signalverarbeitung. Im Gegensatz zum traditionellen imperativen Ansatz, bei dem Sie die Reihenfolge der Aktionen explizit angeben, beschreibt die reaktive Programmierung Abhängigkeiten zwischen Daten: Wenn sich ein Element ändert, werden alle davon abhängigen automatisch aktualisiert.

\n\n

Grundlegende Konzepte der reaktiven Programmierung

\n\n
    \n
  • Observable (Beobachtbar) — eine Datenquelle, die Ereignisse erzeugt.
  • \n
  • Observer (Beobachter) — ein Abonnent, der auf Ereignisse reagiert.
  • \n
  • Subscription (Abonnement) — die Verbindung zwischen Observable und Observer.
  • \n
  • Operatoren — Funktionen zur Transformation, Filterung und Kombination von Strömen (map, filter, merge, switch_on_next).
  • \n
\n\n

In C++ wird die reaktive Programmierung durch Bibliotheken implementiert, die diese Abstraktionen bereitstellen. Betrachten wir drei der beliebtesten Werkzeuge.

\n\n

1. RxCpp — Die Reactive Extensions Bibliothek für C++

\n\n

RxCpp ist ein Port des beliebten ReactiveX-Modells (Rx) auf C++. Es bietet einen leistungsstarken Satz von Operatoren für die Arbeit mit asynchronen Strömen. Die Bibliothek verwendet modernes C++17/20, Templates und Lambda-Ausdrücke.

\n\n

Beispiel: Einfaches Abonnement eines Zahlenstroms

\n\n
#include <rxcpp/rx.hpp>\n#include <iostream>\n\nint main() {\n    // Erstellen eines beobachtbaren Zahlenstroms\n    auto observable = rxcpp::observable<>::range(1, 5);\n\n    // Abonnieren\n    observable.subscribe(\n        [](int v) { std::cout << "Empfangen: " << v << std::endl; }, // on_next\n        []() { std::cout << "Abgeschlossen!" << std::endl; }            // on_completed\n    );\n\n    return 0;\n}\n
\n\n

Beispiel: Filterung und Transformation

\n\n
#include <rxcpp/rx.hpp>\n#include <iostream>\n\nint main() {\n    auto values = rxcpp::observable<>::range(1, 10)\n        .filter([](int x) { return x % 2 == 0; })  // nur gerade\n        .map([](int x) { return x * x; });         // quadrieren\n\n    values.subscribe([](int v) { std::cout << v << " "; });\n    // Ausgabe: 4 16 36 64 100\n\n    return 0;\n}\n
\n\n

Eigenschaften von RxCpp:

\n
    \n
  • Unterstützung für Multithreading und Scheduler.
  • \n
  • Reichhaltiger Satz von Operatoren (merge, zip, combine_latest, debounce, throttle).
  • \n
  • Integration mit std::future und asynchronen Operationen.
  • \n
  • Kompatibel mit CMake und vcpkg.
  • \n
\n\n

2. Boost.Signals2 — Signale und Slots ohne externe Abhängigkeiten

\n\n

Boost.Signals2 ist eine Bibliothek aus dem Boost-Projekt, die einen Mechanismus für Signale und Slots implementiert. Sie ist eine threadsichere Weiterentwicklung des ursprünglichen Boost.Signals. Ideal geeignet für ereignisgesteuerte Architekturen, insbesondere in GUI- und Spiele-Engines.

\n\n

Beispiel: Einfaches Signal mit zwei Slots

\n\n
#include <boost/signals2.hpp>\n#include <iostream>\n\nvoid hello() { std::cout << "Hallo, "; }\nvoid world() { std::cout << "Welt!" << std::endl; }\n\nint main() {\n    boost::signals2::signal<void()> sig;\n\n    sig.connect(&hello);\n    sig.connect(&world);\n\n    sig();  // Signalaufruf — ruft beide Slots auf\n    // Ausgabe: Hallo, Welt!\n\n    return 0;\n}\n
\n\n

Beispiel: Signal mit Parametern und Rückgabewert

\n\n
#include <boost/signals2.hpp>\n#include <iostream>\n#include <string>                    

Empfehlungen