Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Quantities

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 40. Boost.Units 1.1.0

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

количествоопределяется как величина произвольного типа значений, связанная с конкретной единицей. Например, в то время как метр является единицей, 3,0 метра является величиной. Количества подчиняются двум отдельным алгебрам: родной алгебре для их типа значений и алгебре размерного анализа для связанной единицы. Кроме того, алгебраические операции определяются между единицами и величинами, чтобы упростить определение величин; это фактически эквивалентно алгебре с единицей величины.

Количества реализуются классом шаблонов<quantity>, определенным в<boost/units/quantity.hpp>:

template<class Unit,class Y = double> class quantity;

Этот класс формируется как по типу единицы (<Unit>), так и по типу значения (<Y>), причем последняя по умолчанию имеет двухточную плавающую точку, если не указано иное. Тип значения должен иметь обычного конструктора копий и оператора присвоения копий. Операторы +, -, * и/предусмотрены для алгебраических операций между скалярами и единицами, скалярами и величинами, единицами и величинами, а также между величинами. Кроме того, интегральные и рациональные силы и корни могут быть вычислены с помощью функций<pow>и<root>. Наконец, предусмотрен стандартный набор булевых операторов сравнения<==,!=,<, <=,>, and>=>, позволяющий сравнивать величины из одной и той же единицы системы. Все операторы просто делегируют соответствующему оператору тип значения, если позволяют единицы.

Для большинства распространенных типов значений тип результата арифметических операторов является таким же, как и сам тип значения. Например, сумма двух чисел с двойной точностью является еще одним числом с двойной точностью. Однако есть случаи, когда это не так. Простой пример приведен внатуральных числах, где оператор арифметики подчиняется следующим правилам (используя стандартную нотацию длясистем чисел):

  • form_12
  • form_13
  • form_14
  • form_15

Эта библиотека предназначена для поддержки произвольной алгебры типа значений для сложения, вычитания, умножения, деления и рациональных сил и корней. Используется Boost. Тип, чтобы определить результат этих операторов. Для компиляторов, поддерживающих<typeof>, автоматически выводится соответствующий тип значения. Для компиляторов, не обеспечивающих языковую поддержку<typeof>, необходимо зарегистрировать все используемые типы. В случае натуральных чисел это будет что-то вроде следующего:

BOOST_TYPEOF_REGISTER_TYPE(natural);
BOOST_TYPEOF_REGISTER_TYPE(integer);
BOOST_TYPEOF_REGISTER_TYPE(rational);

Конверсия имеет значение только для величин, поскольку подразумевает наличие по меньшей мере мультипликативного масштабного фактора и, возможно, аффинного линейного смещения. Макрос для упрощения определения конверсий между единицами можно найти в<boost/units/conversion.hpp>и<boost/units/absolute.hpp>(для аффинных конверсий со смещениями).

Макро<BOOST_UNITS_DEFINE_CONVERSION_FACTOR>определяет масштабный коэффициент для преобразования из первого типа единицы во второй. Первый аргумент должен быть<base_unit>. Второй аргумент может быть либо<base_unit>, либо<unit>.

Объявим простую базовую единицу:

struct foot_base_unit : base_unit<foot_base_unit, length_dimension, 10> { };

Теперь мы хотим иметь возможность превращать ноги в метры и наоборот. Нога определяется как 0,3048 метра, поэтому мы можем написать следующее:

BOOST_UNITS_DEFINE_CONVERSION_FACTOR(foot_base_unit, meter_base_unit, double, 0.3048);

В качестве альтернативы можно использовать длину SI<typedef>:

BOOST_UNITS_DEFINE_CONVERSION_FACTOR(foot_base_unit, SI::length, double, 0.3048);

Поскольку единицей длины СИ является метр, эти два определения эквивалентны. Если эти преобразования были определены, то преобразование между масштабированными формами этих единиц также будет автоматически работать.

Макро<BOOST_UNITS_DEFAULT_CONVERSION>определяет преобразование, которое будет применяться к базовой единице, когда прямое преобразование невозможно. Это может быть использовано для того, чтобы произвольные преобразования работали с одной специализацией:

struct my_unit_tag : boost::units::base_unit<my_unit_tag, boost::units::force_type, 1> {};
// define the conversion factor
BOOST_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<Unit,Y>>до<quantity<Unit,Z>>допускается, если<Y>и<Z>неявно конвертируемы.
  • <quantity<Unit,Y>>и<quantity<Unit,Z>>допускается, если<Y>и<Z>являются неявно конвертируемыми.
  • Допускается явное преобразование между<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>. Это, естественно, обходит любую проверку типа вновь присвоенного значения, поэтому этот метод следует использовать только при крайней необходимости.

Конечно, в любое время допускается неявная конверсия, явная конверсия также является законной.

Поскольку безразмерные величины не имеют ассоциированных единиц, они ведут себя как нормальные скаляры и позволяют имплицитное преобразование в и из базового типа или типов значений, которые конвертируются в / из этого типа значений.


PrevUpHomeNext

Статья Quantities раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 40. Boost.Units 1.1.0 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 40. Boost.Units 1.1.0 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:26:04/0.010569095611572/1