0 Tage Serie
cpp / expert
Snippet

Statische Einheitenprüfung mit benutzerdefinierten Literalen

Typsicherheit auf Expertenniveau durch benutzerdefinierte Literale. Durch das Kapseln von Primitivtypen in Strukturen und das Definieren eigener Literal-Operatoren lassen sich Logikfehler wie das Addieren von Metern zu Kilometern bereits zur Kompilierzeit verhindern.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
struct Meters {
long double val;
explicit constexpr Meters(long double m) : val(m) {}
};
struct Kilometers {
long double val;
explicit constexpr Kilometers(long double k) : val(k) {}
};
constexpr Meters operator"" _m(long double m) { return Meters(m); }
constexpr Kilometers operator"" _km(long double k) { return Kilometers(k); }
void navigate(Meters distance) {
std::cout << "Traveling " << distance.val << " meters.\n";
}
int main() {
navigate(500.0_m); // Correct
// navigate(1.2_km); // Compilation Error: prevents mixing units
}
Erklärung
1
constexpr Meters operator"" _m(long double m)
Definiert ein benutzerdefiniertes Suffix, das eine Literalausdruck zur Kompilierzeit in ein typisiertes Objekt umwandelt.
2
explicit constexpr Meters(long double m)
Das Schlüsselwort 'explicit' verhindert versehentliche implizite Konvertierungen von rohen numerischen Typen.