Потому что буст. Единицы включают плоские и твердоугольные блоки в системе СИ, крутящий момент и энергия, по сути, различимы (см.крутящий момент).. Кроме того, энергия является истиннойскалярнойвеличиной, в то время как крутящий момент, несмотря на наличие тех же единиц, что и энергия, если угол плоскости не включен, на самом деле являетсяпсевдовектором. Таким образом, также может быть реализован тип значений, представляющий псевдовекторы и инкапсулирующий их алгебру.
Однако есть несколько единиц СИ, которые неразличимы в системе СИ. К ним относятсябеккерель, который имеет единицы, идентичные частоте (Гц), исиверт, который вырождается ссерым. В таких случаях правильный способ лечения этой разницы состоит в том, чтобы признать, что расширение набора базовых размеров может обеспечить неоднозначность. Например, добавление базового измерения для радиоактивных распадов позволило бы записывать беккерель как распад/секунду, отличая его от подписи герца, которая составляет всего 1/секунду.
Если вам это не нравится, вы можете просто игнорировать угловые единицы и идти своим веселым путем (периодически облажаться, когда рутина хочет градусов, и вы даете ей радианы вместо этого).
Рассмотрим следующий код:
cout << sin(asin(180.0 * degrees));
Что должен напечатать этот отпечаток? Если бы были доступны только гетерогенные системы, он бы напечатал 3.14159 + rad Почему? Что ж,<asin
>вернет<quantity<dimensionless>
>фактически потеряв информацию о том, что используются степени. Для распространения этой дополнительной информации нам нужны однородные системы.
Это только нарушает общий код, который должен быть нарушен в любом случае. Единственное буквальное значение, которое должно быть преобразовано в величину общим кодом, равно нулю, которое должно обрабатываться конструктором по умолчанию. Кроме того, рассмотрите проблему поиска и замены, позволяющую это:
quantity<si::length> q(1.0);
Здесь цель ясна - мы хотим длину одного в системе СИ, которая составляет один метр. Однако представьте себе, что какой-то благонамеренный программист пытается повторно использовать этот код, но вместо этого он выполняет вычисления в системе блоков CGS. После поиска<si::
>и замены<cgs::
>у нас есть:
quantity<cgs::length> q(1.0);
К сожалению, значение этого утверждения внезапно изменилось с одного метра на один сантиметр. В отличие от реализованного, мы начинаем с:
quantity<si::length> q(1.0*si::meter);
После поиска и замены:
quantity<cgs::length> q(1.0*cgs::meter);
Что приводит нас к ошибке. Даже если код имеет расширение пространства имен::units:::si; декларация, последняя все еще безопасна:
using namespace boost::units::si;
quantity<length> q(1.0*meter);
идти
using namespace boost::units::cgs;
quantity<length> q(1.0*meter);
Последнее будет включать в себя явное преобразование от метров до сантиметров, но значение остается верным.