You can define some new types (or use boost units as mentioned above),
A user defined solution could be similar to:
#define DECLARE_UNIT(UnitName) \
struct UnitName { \
UnitName(const long double val) noexcept : val_(val) {};\
long double val_ = 0.0; \
};
DECLARE_UNIT(Joule);
DECLARE_UNIT(Newton);
DECLARE_UNIT(Meters);
const Newton operator""_N(const long double n) noexcept {
return Newton(n);
}
const Meters operator""_m(const long double m) noexcept {
return Meters(m);
}
const Joule operator*(const Newton& newtons, const Meters& meters) noexcept {
return newtons.val_ * meters.val_;
}
int main() {
auto force = 5.0_N;
auto distance = 6.8_m;
auto energy = force * distance; // of Joule type
}