Возможно, оксюморонный вопрос: соотношение<,> по определению является константой времени компиляции.
Однако я хотел бы построить длительности с различными соотношениями, которые могут быть определены вызывающей стороной моего метода. Я предполагаю, что я должен использовать что-то кроме отношения и / или продолжительности, но что?
Я хочу иметь, скажем, члена класса, который может быть установлен во время выполнения, и я хотел бы, чтобы он имел соотношение типов<,>. В какой-то момент в коде, где этот член получает установлен / назначается, ему будет назначено постоянное отношение, но в моем классе я не хочу указывать, каким должно быть это отношение.
Вы сказали, что вам нужно std::ratio
который «может быть указан вызывающим абонентом». Есть три разных варианта:
std::ratio
параметры шаблона во время время компиляции. Это тривиально, просто установите параметры, например, using quarter = std::ratio<1, 4>
,std::ratio
параметры шаблона во время время выполнения. Это невозможно по определению, std::ratio
это константа времени компиляции. Вам нужно будет реализовать свой собственный класс для вычисления коэффициентов во время выполнения или использовать какую-то библиотеку (я не знаю ни одной, предложения приветствуются!).std::duration
(это то, что вы, кажется, используете свой std::ratio
Просто для умножьте это на число.Ответ иллюстрирует общий подход с шаблонами C ++:
template<typename ratio_type>
returnvalue function_name(ration_type const& r, other parameter...)
{ ... }
Дело в том, что сам тип отношения содержит информацию. Поскольку типы (часто, но не всегда) являются параметрами, передаваемыми шаблонам, эти параметры также передаются через шаблоны. Конечно, это только переносит проблему в другое место, поэтому в какой-то момент вы возьмете числитель и знаменатель из отношения и будете использовать его в качестве значений.
Кстати: рассмотреть std::div
(http://en.cppreference.com/w/cpp/numeric/math/div) как альтернатива.