0 Tage Serie
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.