#include using namespace std; namespace arithmetic { template class Addition { public: template T operator+(const V& v) const { T res(static_cast(*this)); return res += static_cast(v); } }; template class Subtraction { public: template T operator-(const V& v) const { T res(static_cast(*this)); return res -= static_cast(v); } }; template class Multiplication { public: template T operator*(const V& v) const { T res(static_cast(*this)); return res *= static_cast(v); } }; template class Division { public: template T operator/(const V& v) const { T res(static_cast(*this)); return res /= static_cast(v); } }; template class Modulus { public: template T operator%(const V& v) const { T res(static_cast(*this)); return res %= static_cast(v); } }; } template class IndivisibleArithmetic : public arithmetic::Addition, public arithmetic::Subtraction, public arithmetic::Multiplication {}; template class Arithmetic : public IndivisibleArithmetic, public arithmetic::Division {}; struct Time : public arithmetic::Addition