Using std::chrono to make custom "SI unit" types
Meters are Not Seconds

using meters = std::chrono::seconds;


I know it's obvious, but it bears stating. A meter is not a second. You compare a meter and a second, you cannot add them, etc. They are different types completely. So what you want is to make a different type:

template &lt;typename T, class Ratio = std::ratio&lt;1&gt;&gt;
class distance;

using meters = distance&lt;int64_t&gt;;


I'll leave the implementation of distance up to you. But it should absolutely be a different class than seconds!

Use the Standard Ratios

&lt;ratio&gt; actually provides a bunch of standard ratios for your use. You should use them:

using centimeters = distance&lt;int64_t, std::centi&gt;;


You'll note that std::centi is std::ratio&lt;1, 100&gt;, which makes more sense for centimeters than std::ratio&lt;100&gt;.

Use integral types

You'll notice I used int64_t instead of float or double. Prefer using integers whenever possible to simply sidestep the issue of floating point arithmetic altogether.