0 day streak
cpp / expert
Snippet

Static Unit Checker with User-Defined Literals

Expert-level type safety using user-defined literals. By wrapping raw types in structs and defining custom literal operators, you can prevent logic errors like adding meters to kilometers at compile-time.

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
}
Breakdown
1
constexpr Meters operator"" _m(long double m)
Defines a custom suffix that converts a literal number into a typed object at compile-time.
2
explicit constexpr Meters(long double m)
The 'explicit' keyword prevents accidental implicit conversions from raw numeric types.