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