Понятиеразмерного анализаобычно представлено на ранней стадии во вводных классах физики и техники как средство определения правильности уравнения или вычисления путем распространения физического измеренияединицразличных величин через уравнение вместе с их числовыми значениями. Существует ряд стандартных единичных систем, наиболее известным из которых являетсяSysteme International(также известный как SI или MKS (метр-килограмм-секунда), который был метрическим предшественником системы SI, названной в честь трех базовых единиц, на которых основана система). SI является единственной официальной международной стандартной системой и широко используется в науке и технике. Другие распространенные системы включают системуCGS(сантиметр-грамм-секунда) и системуEnglish, все еще используемую в некоторых проблемных областях в Соединенных Штатах и в других местах. В физике также существует ряд других систем, которые широко используются в специализированных дисциплинах. Они называютсянатуральными единицами. Когда величины, представляющие различные измеримые величины, объединяются, размерный анализ обеспечивает средства оценки согласованности полученного расчета. Например, сумма двух длин также является длиной, в то время как произведение двух длин является областью, а сумма длины и области не определена. Тот факт, что аргументы для многих функций (таких как exp, log и т.д.) должны быть безразмерными величинами, может быть легко продемонстрирован путем изучения их последовательного расширения в контексте размерного анализа. Эта библиотека облегчает применение такого рода ограничений в коде, включающем размерные величины.
В следующем обсуждении мы рассматриваем размерный анализ как абстракцию, в которой произвольный наборединицподчиняется правилам конкретной алгебры. Мы будем ссылаться на пару базового измерения и рационального экспонента как нафундаментальное измерениеи список, состоящий из произвольного числа фундаментальных измерений как насоставное измерениеили простоизмерение. В частности, учитывая набор
фундаментальных измерений, обозначаемых
, и набор
рациональных экспонентов
, любое возможное (составное) измерение может быть записано как
.
Композитные измерения подчиняются алгебраическим правилам размерного анализа. В частности, для любого скалярного значения
и составных размеров
и
, где
, мы имеем:

Пользователи библиотеки размерного анализа должны иметь возможность указать произвольный список базовых измерений для получения композитного измерения. Это может включать в себя повторные теги. Например, можно выразить энергию как
,
,
или любую другую перестановку массы, длины и времени, имеющую совокупные экспоненты 1, 2 и -2 соответственно. Для того чтобы иметь возможность выполнять вычисления на произвольных наборах измерений, все составные измерения должны быть сведены к однозначному окончательному составному измерению, которое мы будем называтьуменьшенным измерением, для которого
- Фундаментальные измерения последовательно упорядочены
- Размеры с нулевым показателем ускользают. Обратите внимание, что уменьшенные размеры никогда не имеют более
базовых размеров, по одному для каждого отдельного фундаментального измерения, но могут иметь меньше.
В нашей реализации размеры базы связаны с типами тегов. Поскольку мы в конечном итоге будем представлять композиционные измерения в виде списков типов, мы должны предоставить некоторый механизм сортировки базовых размерностей, чтобы сделать возможным преобразование произвольного композитного измерения в уменьшенное измерение. Для этого мы присваиваем каждому базовому измерению уникальное целое число. Класс<base_dimension
>(найден в<boost/units/base_dimension.hpp
>) использует любопытно повторяющийся шаблон (CRTP) метод, чтобы гарантировать, что порядки, указанные для размеров основания, являются уникальными:
template<class Derived, long N> struct base_dimension { ... };
С помощью этого мы можем определить базовые размеры для длины, массы и времени как:
struct length_base_dimension : base_dimension<length_base_dimension,1> { };
struct mass_base_dimension : base_dimension<mass_base_dimension,2> { };
struct time_base_dimension : base_dimension<time_base_dimension,3> { };
Важно отметить, что выбор порядка является полностью произвольным, если каждый тег имеет уникальное числовое значение; неуникальные порядки помечаются как ошибки во время компиляции. Отрицательные порядки зарезервированы для использования библиотекой. Для определения композитных размеров, соответствующих размерам основания, мы просто создаем MPL-соответствующие списки типов фундаментальных измерений, используя класс<dim
>для инкапсуляции пар размеров основания и<static_rational
>экспонентов. Класс<make_dimension_list
>действует как обертка для обеспечения того, чтобы полученный тип имел уменьшенную размерность:
typedef make_dimension_list<
boost::mpl::list< dim< length_base_dimension,static_rational<1> > >
>::type length_dimension;
typedef make_dimension_list<
boost::mpl::list< dim< mass_base_dimension,static_rational<1> > >
>::type mass_dimension;
typedef make_dimension_list<
boost::mpl::list< dim< time_base_dimension,static_rational<1> > >
>::type time_dimension;
Это также может быть легко выполнено с помощью удобного типдефа, предоставленного<base_dimension
>:
typedef length_base_dimension::dimension_type length_dimension;
typedef mass_base_dimension::dimension_type mass_dimension;
typedef time_base_dimension::dimension_type time_dimension;
Таким образом, приведенный выше код идентичен полному определению списка типов. Композитные размеры также определяются с помощью списка типов:
typedef make_dimension_list<
boost::mpl::list< dim< length_base_dimension,static_rational<2> > >
>::type area_dimension;
typedef make_dimension_list<
boost::mpl::list< dim< mass_base_dimension,static_rational<1> >,
dim< length_base_dimension,static_rational<2> >,
dim< time_base_dimension,static_rational<-2> > >
>::type energy_dimension;
Предоставляется также класс удобства для композитных размеров с целыми полномочиями:
typedef derived_dimension<length_base_dimension,2>::type area_dimension;
typedef derived_dimension<mass_base_dimension,1,
length_base_dimension,2,
time_base_dimension,-2>::type energy_dimension;