Подтвердить что ты не робот

Принципы проектирования std:: ratio <>

Я смотрел класс std::ratio<> из стандарта С++ 11, который позволяет сделать рациональную арифметику времени компиляции.

Я нашел дизайн шаблона и операции, реализованные с чересчур сложными классами, и не нашел причин, по которым они не могли просто использовать более простой и интуитивно понятный подход, реализуя действительно простой рациональный класс и определяя функции constexpr для операторов, Результат был бы более простым в использовании классом, и преимущества времени компиляции остались бы.

Кто-нибудь имеет представление о преимуществах существующего проекта std::ratio<> по сравнению с простой реализацией класса с использованием constexpr? На самом деле, я не могу найти никакого преимущества для текущей реализации.

4b9b3361

Ответ 1

Когда предлагалось N2661, ни один из авторов заявки не имел доступа к компилятору, который реализовал constexpr. И никто из нас не хотел предлагать то, что мы не могли построить и проверить. Так, будь то лучший дизайн можно было бы сделать с помощью constexpr, не было даже частью рассмотрения для дизайна. Дизайн был основан только на тех инструментах, которые были доступны авторам в то время.

Ответ 2

Решение constexpr решает совершенно другую проблему. std::ratio был создан для использования в качестве моста между переменными, использующими разные единицы, а не как математический инструмент. В этих обстоятельствах вы абсолютно обязательно хотите, чтобы отношение было частью типа. Решение constexpr там не работает. Например, реализовать std::duration невозможно без времени выполнения и затрат времени исполнения, поскольку каждый объект продолжительности должен будет нести свою информацию о номинаторе/знаменателе внутри объекта.

Ответ 3

std::ratio, и его окружающие механизмы всегда будут выполняться во время компиляции, в силу метапрограммирования шаблонов и манипуляции типа. constexpr требуется только для запуска во время выполнения, когда постоянное выражение требуется средствами С++ (такие параметры шаблона или инициализация переменной constexpr).

Итак, что более важно для вас: выполнение компиляции или "более понятное и понятное"?