Принципы проектирования std:: ratio <>
Я смотрел класс std::ratio<>
из стандарта С++ 11, который позволяет сделать рациональную арифметику времени компиляции.
Я нашел дизайн шаблона и операции, реализованные с чересчур сложными классами, и не нашел причин, по которым они не могли просто использовать более простой и интуитивно понятный подход, реализуя действительно простой рациональный класс и определяя функции constexpr
для операторов, Результат был бы более простым в использовании классом, и преимущества времени компиляции остались бы.
Кто-нибудь имеет представление о преимуществах существующего проекта std::ratio<>
по сравнению с простой реализацией класса с использованием constexpr
? На самом деле, я не могу найти никакого преимущества для текущей реализации.
Ответы
Ответ 1
Когда предлагалось N2661, ни один из авторов заявки не имел доступа к компилятору, который реализовал constexpr
. И никто из нас не хотел предлагать то, что мы не могли построить и проверить. Так, будь то лучший дизайн можно было бы сделать с помощью constexpr
, не было даже частью рассмотрения для дизайна. Дизайн был основан только на тех инструментах, которые были доступны авторам в то время.
Ответ 2
Решение constexpr решает совершенно другую проблему. std::ratio
был создан для использования в качестве моста между переменными, использующими разные единицы, а не как математический инструмент. В этих обстоятельствах вы абсолютно обязательно хотите, чтобы отношение было частью типа. Решение constexpr там не работает. Например, реализовать std::duration
невозможно без времени выполнения и затрат времени исполнения, поскольку каждый объект продолжительности должен будет нести свою информацию о номинаторе/знаменателе внутри объекта.
Ответ 3
std::ratio
, и его окружающие механизмы всегда будут выполняться во время компиляции, в силу метапрограммирования шаблонов и манипуляции типа. constexpr
требуется только для запуска во время выполнения, когда постоянное выражение требуется средствами С++ (такие параметры шаблона или инициализация переменной constexpr
).
Итак, что более важно для вас: выполнение компиляции или "более понятное и понятное"?