cpp / expert
Snippet
Algebraisches Pattern Matching mit typsicheren Visitor-Objekten
Dieses Snippet nutzt das 'Overload'-Pattern, um algebraisches Pattern Matching in C++ zu implementieren. Es kombiniert variadische Vererbung und Deduction-Guides, um einen typsicheren Visitor für std::variant zu erstellen, was komplexen Kontrollfluss basierend auf Variant-Datentypen ermöglicht.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <variant>#include <string>template<class... Ts> struct overload : Ts... { using Ts::operator()...; };template<class... Ts> overload(Ts...) -> overload<Ts...>;using State = std::variant<int, std::string, bool>;void dispatch(const State& s) {std::visit(overload {[](int i) { /* Control flow for integer */ },[](const std::string& s) { /* Control flow for string */ },[](bool b) { /* Control flow for boolean */ }}, s);}
Erklärung
1
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
Nutzt variadische Vererbung, um mehrere Lambda-Funktionsaufrufoperatoren in einem einzigen Typ zu aggregieren.
2
std::visit(overload { ... }, s);
Leitet die Ausführung basierend auf dem zur Laufzeit im Variant gespeicherten aktiven Typ an das entsprechende Lambda weiter.