cpp / expert
Snippet
Semantische Sicherheit durch starke Typ-Templates
Dieses Muster verwendet Templates, um primitive Datentypen basierend auf einem 'Tag'-Typ in eindeutige Klassen zu kapseln. Dies verhindert versehentliche implizite Konvertierungen und logische Fehler, wie das Vertauschen von Breiten- und Höhenparametern in Funktionsaufrufen, die der Compiler sonst nicht erkennen kann.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T, typename Tag>class StrongType {public:explicit StrongType(T const& value) : value_(value) {}T& get() { return value_; }T const& get() const { return value_; }private:T value_;};struct WidthTag {};struct HeightTag {};using Width = StrongType<double, WidthTag>;using Height = StrongType<double, HeightTag>;void setDimensions(Width w, Height h) {}
Erklärung
1
template <typename T, typename Tag>
Deklariert ein Template, das den zugrunde liegenden Datentyp und einen Phantom-Tag-Typ zur Sicherstellung der Eindeutigkeit aufnimmt.
2
explicit StrongType(T const& value)
Das Schlüsselwort explicit verhindert, dass der Compiler unbeabsichtigte implizite Konvertierungen vom Basistyp vornimmt.
3
using Width = StrongType<double, WidthTag>;
Erzeugt einen konkreten Typ für Width, der zur Kompilierzeit von jedem anderen Double-basierten StrongType unterschieden wird.