cpp / expert
Snippet
Algebraische Datentypen für robusten Kontrollfluss
Die Verwendung von std::variant und std::visit ermöglicht typsichere Verzweigungen ohne den Overhead von Vererbung oder die Risiken von C-Unions. Es zwingt den Entwickler dazu, verschiedene Datenzustände explizit zu behandeln, was einen vorhersehbareren Kontrollfluss schafft.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <variant>#include <iostream>#include <string>struct Success { std::string data; };struct Failure { int errorCode; };using Result = std::variant<Success, Failure>;void handleResult(const Result& res) {std::visit([](auto&& arg) {using T = std::decay_t<decltype(arg)>;if constexpr (std::is_same_v<T, Success>)std::cout << "OK: " << arg.data << std::endl;else if constexpr (std::is_same_v<T, Failure>)std::cout << "Error: " << arg.errorCode << std::endl;}, res);}
Erklärung
1
using Result = std::variant<Success, Failure>;
Erstellt einen Summentyp, der entweder ein Success- oder ein Failure-Objekt enthalten kann.
2
std::visit([](auto&& arg) { ... }, res);
Wendet eine Lambda-Funktion auf den aktuell aktiven Typ in der Variante an.
3
if constexpr (std::is_same_v<T, Success>)
Führt eine Typprüfung zur Kompilierzeit durch, um den richtigen Logikzweig auszuführen.