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.