#include #include #include // m/s - SI derived unit struct Speed { long double value; }; // m - SI unit template > struct Length { unsigned long long value; }; auto operator ""_m(unsigned long long n) { return Length<>{n}; } auto operator ""_km(unsigned long long n) { return Length{n}; } template auto operator / ( const Length &len, const std::chrono::duration &dur) { const auto len_ratio = static_cast(Ratio::num) / Ratio::den; const auto dur_sec = std::chrono::duration_cast(dur); return Speed{len_ratio * len.value / dur_sec.count()}; } int main() { using namespace std::chrono_literals; const Speed s1 = 30_m / 1s; const Speed s2 = 108'000_m / 3'600s; const Speed s3 = 108_km / 3'600s; const Speed s4 = 108_km / 1h; std::cout << "s1 = 30_m / 1s == " << s1.value << " m/s\n"; std::cout << "s2 = 108'000_m / 3'600s == " << s2.value << " m/s\n"; std::cout << "s3 = 108_km / 3'600s == " << s3.value << " m/s\n"; std::cout << "s4 = 108_km / 1h == " << s4.value << " m/s\n"; return 0; }