Коэффициент & л;, & GT; является постоянным, но что, если я хочу принять разные соотношения в качестве аргумента?

Возможно, оксюморонный вопрос: соотношение<,> по определению является константой времени компиляции.

Однако я хотел бы построить длительности с различными соотношениями, которые могут быть определены вызывающей стороной моего метода. Я предполагаю, что я должен использовать что-то кроме отношения и / или продолжительности, но что?

Я хочу иметь, скажем, члена класса, который может быть установлен во время выполнения, и я хотел бы, чтобы он имел соотношение типов<,>. В какой-то момент в коде, где этот член получает установлен / назначается, ему будет назначено постоянное отношение, но в моем классе я не хочу указывать, каким должно быть это отношение.

6

Решение

Вы сказали, что вам нужно std::ratio который «может быть указан вызывающим абонентом». Есть три разных варианта:

  • Звонящий хочет установить std::ratio параметры шаблона во время время компиляции. Это тривиально, просто установите параметры, например, using quarter = std::ratio<1, 4>,
  • Звонящий хочет установить std::ratio параметры шаблона во время время выполнения. Это невозможно по определению, std::ratio это константа времени компиляции. Вам нужно будет реализовать свой собственный класс для вычисления коэффициентов во время выполнения или использовать какую-то библиотеку (я не знаю ни одной, предложения приветствуются!).
  • Если вы просто хотите масштабировать свой std::duration (это то, что вы, кажется, используете свой std::ratio Просто для умножьте это на число.
9

Другие решения

Ответ иллюстрирует общий подход с шаблонами 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) как альтернатива.

3

По вопросам рекламы [email protected]