cpp / expert
Snippet
Streng typisierte opake Wrapper mittels Phantom-Typen
Eine Experten-Technik für Typsicherheit unter Verwendung von 'Phantom-Typen', um primitive Daten zu kapseln. Sie erstellt unterschiedliche Typen aus derselben zugrunde liegenden Repräsentation (z. B. int) und verhindert so versehentliche Zuweisungen oder Vergleiche zwischen semantisch unterschiedlichen Identifikatoren wie User-IDs und Account-IDs.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T, typename Tag>struct Opaque {explicit Opaque(T val) : value(val) {}T value;bool operator==(const Opaque& other) const { return value == other.value; }};struct UserIdTag {};struct AccountIdTag {};using UserId = Opaque<int, UserIdTag>;using AccountId = Opaque<int, AccountIdTag>;void process(UserId u) { /* ... */ }
Erklärung
1
template <typename T, typename Tag>
Deklariert ein Template, bei dem 'Tag' der Phantom-Typ ist, der nur zur Differenzierung dient.
2
explicit Opaque(T val)
Das Schlüsselwort explicit verhindert die implizite Konvertierung vom Roh-Typ zum Wrapper.
3
using UserId = Opaque<int, UserIdTag>;
Definiert einen eindeutigen Typ für User-IDs, der nicht mit Account-IDs vermischt werden kann.