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