Ratio<,> is constant, but what if I want to accept different ratios as an argument?

Ok, you need a std::ratio which "can be specified by the caller". There are three different options:

  • The caller wants to set std::ratio template parameters during compile time. This is trivial, simply set the parameters, e.g. using quarter = std::ratio<1, 4>.
  • The caller wants to set std::ratio template parameters during runtime. This is not possible by definition, std::ratio is a compile-time constant. You will have to implement your own class for computing ratios during runtime or use some kind of library (I don't know of any, suggestions welcome!).
  • The caller merely wants to scale a std::duration (which is what you seem to use your std::ratio for). Then just multiply it with a number.

The answer illustrates a common approach with C++ templates:

template<typename ratio_type>
returnvalue function_name(ration_type const& r, other parameter...)
{ ... }

The point is, that the very type of the ratio contains information. Since types (often, but not always) are the parameters passed to templates, you forward those parameters via templates, too. Of course, this only shifts the problem to a different place, so at some point you will take the numerator and denominator from the ratio and use it as values.

BTW: Consider std::div (http://en.cppreference.com/w/cpp/numeric/math/div) as alternative.