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