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.