cpp / expert
Snippet
Typsichere algebraische Summentypen mittels std::variant
std::variant ist eine typsichere Union, die weiß, welchen Typ sie gerade enthält. Die Verwendung von std::visit ermöglicht eine vollständige Prüfung aller möglichen Typen zur Kompilierzeit und ersetzt unsichere C-Unions sowie komplexe Vererbungshierarchien für einfache Summentypen.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <variant>#include <string>#include <iostream>using Result = std::variant<int, std::string, double>;struct Visitor {void operator()(int i) const { std::cout << "Integer: " << i; }void operator()(const std::string& s) const { std::cout << "String: " << s; }void operator()(double d) const { std::cout << "Double: " << d; }};int main() {Result r = "Error 404";std::visit(Visitor{}, r);r = 42;std::visit([](auto&& arg) { std::cout << arg; }, r);}
Erklärung
1
using Result = std::variant<int, std::string, double>;
Definiert eine Variable, die sicher genau einen der aufgelisteten Typen halten kann.
2
std::visit(Visitor{}, r);
Wendet die passende Überladung des Visitors basierend auf dem Laufzeittyp in der Variant an.