#include namespace kel { template unit...>::unit(const value_type& value_): value{value_}{} template unit...>::unit(value_type&& value_):value{std::move(value_)}{} template unit...>& unit...>::operator=(const typename unit...>::value_type& value_){ value = value_; return *this; } template unit...>& unit...>::operator=(typename unit...>::value_type&& value_){ value = std::move(value_); return *this; } template unit...> unit...>::operator+(const unit...>& rhs){ return value + rhs.value; } template unit...> unit...>::operator-(const unit...>& rhs){ return value - rhs.value; } template template typename unit_multiplication...>, unit>::type unit...>::operator*(const unit& rhs){ return value * rhs.data(); } template template typename unit_multiplication...>, typename unit_invert::type>::type unit...>::operator/(const unit& rhs){ typename unit_invert::type rhs_inverted{static_cast(1)/rhs.data()}; return value * rhs_inverted.data(); } template typename unit...>::value_type unit...>::data() const { return value; } }