0 Tage Serie
cpp / expert
Snippet

Starke Identitäts-Kapselung durch Phantom-Typen

Nutzung von Template-Tags zur Erstellung eindeutiger, inkompatibler Typen aus einem einzigen Primitiv. Dies erzwingt die Domänenlogik auf Typebene und verhindert versehentliches Vermischen von Daten.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
template <typename T, typename Tag>
struct Identity {
explicit Identity(T value) : val(value) {}
T val;
};
using UserId = Identity<int, struct UserTag>;
using OrderId = Identity<int, struct OrderTag>;
void process(UserId id) {}
// UserId u(1); OrderId o(1); process(o); // Error!
Erklärung
1
template <typename T, typename Tag>
Der Tag-Parameter fungiert als 'Phantom-Typ' zur Unterscheidung von Instanzen.
2
explicit Identity(T value)
Verhindert die implizite Konvertierung vom rohen Basistyp.
3
using UserId = Identity<int, struct UserTag>;
Definiert einen eindeutigen Typ für User-IDs unter Verwendung eines anonymen Struct-Tags.