количествоопределяется как величина произвольного типа значений, связанная с конкретной единицей. Например, в то время как метр является единицей, 3,0 метра является величиной. Количества подчиняются двум отдельным алгебрам: родной алгебре для их типа значений и алгебре размерного анализа для связанной единицы. Кроме того, алгебраические операции определяются между единицами и величинами, чтобы упростить определение величин; это фактически эквивалентно алгебре с единицей величины.
Этот класс формируется как по типу единицы (<Unit>), так и по типу значения (<Y>), причем последняя по умолчанию имеет двухточную плавающую точку, если не указано иное. Тип значения должен иметь обычного конструктора копий и оператора присвоения копий. Операторы +, -, * и/предусмотрены для алгебраических операций между скалярами и единицами, скалярами и величинами, единицами и величинами, а также между величинами. Кроме того, интегральные и рациональные силы и корни могут быть вычислены с помощью функций<pow>и<root>. Наконец, предусмотрен стандартный набор булевых операторов сравнения<==,!=,<,<=,>,and>=>, позволяющий сравнивать величины из одной и той же единицы системы. Все операторы просто делегируют соответствующему оператору тип значения, если позволяют единицы.
Для большинства распространенных типов значений тип результата арифметических операторов является таким же, как и сам тип значения. Например, сумма двух чисел с двойной точностью является еще одним числом с двойной точностью. Однако есть случаи, когда это не так. Простой пример приведен внатуральных числах, где оператор арифметики подчиняется следующим правилам (используя стандартную нотацию длясистем чисел):
Эта библиотека предназначена для поддержки произвольной алгебры типа значений для сложения, вычитания, умножения, деления и рациональных сил и корней. Используется Boost. Тип, чтобы определить результат этих операторов. Для компиляторов, поддерживающих<typeof>, автоматически выводится соответствующий тип значения. Для компиляторов, не обеспечивающих языковую поддержку<typeof>, необходимо зарегистрировать все используемые типы. В случае натуральных чисел это будет что-то вроде следующего:
Конверсия имеет значение только для величин, поскольку подразумевает наличие по меньшей мере мультипликативного масштабного фактора и, возможно, аффинного линейного смещения. Макрос для упрощения определения конверсий между единицами можно найти в<boost/units/conversion.hpp>и<boost/units/absolute.hpp>(для аффинных конверсий со смещениями).
Поскольку единицей длины СИ является метр, эти два определения эквивалентны. Если эти преобразования были определены, то преобразование между масштабированными формами этих единиц также будет автоматически работать.
Макро<BOOST_UNITS_DEFAULT_CONVERSION>определяет преобразование, которое будет применяться к базовой единице, когда прямое преобразование невозможно. Это может быть использовано для того, чтобы произвольные преобразования работали с одной специализацией:
structmy_unit_tag:boost::units::base_unit<my_unit_tag,boost::units::force_type,1>{};// define the conversion factorBOOST_UNITS_DEFINE_CONVERSION_FACTOR(my_unit_tag,SI::force,double,3.14159265358979323846);// make conversion to SI the default.BOOST_UNITS_DEFAULT_CONVERSION(my_unit_tag,SI::force);
Эта библиотека предназначена для того, чтобы подчеркнуть безопасность выше удобства при выполнении операций с размерными величинами. В частности, для полного определения как стоимости, так и единицы требуется построение величин. Непосредственная конструкция из скалярного значения запрещена (хотя функция статического элемента<from_value>предусмотрена для обеспечения этой функциональности там, где это необходимо). Кроме того, ссылка<quantity_cast>обеспечивает прямой доступ к базовому значению переменной<quantity>. Предусмотрен явный конструктор, позволяющий осуществлять преобразование между размерно-совместимыми величинами в различных единичных системах. Неявные преобразования между системами блоков допускаются только тогда, когда уменьшенные блоки идентичны, что позволяет, например, тривиальные преобразования между эквивалентными блоками в различных системах (таких как секунды SI и секунды CGS), одновременно позволяя улавливать непреднамеренные несоответствия системы блоков во время компиляции и предотвращая потенциальную потерю точности и накладных расходов на производительность от непреднамеренных преобразований. Назначение следует тем же правилам. Исключение делается для величин, для которых единица сводится к безразмерности; в этом случае допускается неявное преобразование в базовый тип значения через специализацию шаблона класса. Количества различных типов ценностей неявно конвертируемы только в том случае, если сами типы ценностей неявно конвертируемы. Класс<quantity>также определяет элемент<value()>для прямого доступа к базовому значению.
Подводя итог, конверсии допускаются при следующих условиях:
Допускается явное преобразование между<quantity<Unit1,Y>>и<quantity<Unit2,Z>>, если<Unit1>и<Unit2>имеют одинаковые размеры и если<Y>и<Z>неявно конвертируемы.
Неявное преобразование между<quantity<Unit1,Y>>и<quantity<Unit2,Z>>допускается, если<Unit1>сводится к точно такой же комбинации базовых единиц, как<Unit2>, и если<Y>и<Z>являются конвертируемыми.
<quantity<Unit1,Y>>и<quantity<Unit2,Z>>допускается при тех же условиях, что и неявное преобразование.
<quantity<Unit,Y>>может быть непосредственно построен из значения типа<Y>с использованием функции статического элемента<from_value>. Это, естественно, обходит любую проверку типа вновь присвоенного значения, поэтому этот метод следует использовать только при крайней необходимости.
Конечно, в любое время допускается неявная конверсия, явная конверсия также является законной.
Поскольку безразмерные величины не имеют ассоциированных единиц, они ведут себя как нормальные скаляры и позволяют имплицитное преобразование в и из базового типа или типов значений, которые конвертируются в / из этого типа значений.
Статья Quantities раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 40. Boost.Units 1.1.0 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.