cpp / expert
Snippet
Dimensionale Typsicherheit mittels Template-Parametrierung
Dieses Snippet nutzt Template-Metaprogrammierung und std::ratio, um eine Dimensionsanalyse zur Kompilierzeit zu erzwingen. Durch die Definition von Datentypen, die ihre physikalischen Dimensionen (Masse, Länge, Zeit) tragen, verhindert der Compiler logische Fehler wie das Addieren von Distanz zu Zeit.
snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <ratio>template <typename T, typename Mass, typename Length, typename Time>struct Quantity {T value;template <typename M2, typename L2, typename T2>auto operator+(const Quantity<T, M2, L2, T2>& other) const {static_assert(std::is_same_v<Mass, M2> && std::is_same_v<Length, L2> && std::is_same_v<Time, T2>,"Incompatible units!");return Quantity<T, Mass, Length, Time>{value + other.value};}};using Meters = Quantity<double, std::ratio<0>, std::ratio<1>, std::ratio<0>>;using Seconds = Quantity<double, std::ratio<0>, std::ratio<0>, std::ratio<1>>;
Erklärung
1
static_assert(std::is_same_v<Mass, M2> ... "Incompatible units!");
Validiert, dass die Dimensionen zweier Größen übereinstimmen, bevor die Addition zugelassen wird, um Einheitenfehler zu vermeiden.
2
using Meters = Quantity<double, std::ratio<0>, std::ratio<1>, std::ratio<0>>;
Definiert einen konkreten Typ für Meter, bei dem die Dimension Länge auf 1 und andere auf 0 gesetzt sind.