Прежде чем обсуждать основы библиотеки, мы сначала определим несколько терминов, которые будут часто использоваться в следующем:
Базовое измерение: Базовое измерение свободно определяется как измеримая единица интереса; в обычном размерном анализе базовые измерения включают длину ([L]), массу ([M]), время ([T]) и т. Д., Но нет никаких конкретных ограничений на то, какие базовые измерения могут быть использованы. Базовые измерения по существу являются типом тега и сами по себе не обеспечивают функциональности анализа размерности.
Измерение: Коллекция нулевых или более базовых измерений, каждое из которых потенциально может быть поднято до другой рациональной силы. Например, длина = [L]^1, площадь = [L]^2, скорость = [L]^1/[T]^1 и энергия = [M]^1 [L]^2/[T]^2 — все измерения.
Базовый блок: Базовая единица представляет собой определенную меру измерения. Например, в то время как длина является абстрактной мерой расстояния, измеритель является конкретной базовой единицей расстояния. Конверсии определяются с использованием базовых единиц. Как и базовые измерения, базовые единицы являются типом тега, используемым исключительно для определения единиц и не поддерживающим алгебру анализа измерений.
Единица: Набор базовых единиц, поднятых до рациональных показателей, например m^1, кг^1, m^1/s^2.
Система: Единичная система представляет собой совокупность базовых единиц, представляющих все измеримые объекты, представляющие интерес для конкретной проблемы. Например, система единиц СИ определяет семь базовых единиц: длина (L) в метрах, масса (M) в килограммах, время (T) в секундах, ток (I) в амперах, температура (theta) в кельвине, количество (N) в родинках и интенсивность света (J) в канделябрах. Все измеримые сущности в системе СИ могут быть представлены как продукты различных целых или рациональных сил этих семи базовых единиц.
Количество: Количество представляет собой конкретное количество единицы. Таким образом, в то время как измеритель является базовой единицей длины в системе СИ, 5,5 метра является величиной длины в этой системе.
Для начала представим два коротких учебника.Учебник1демонстрирует использованиеединиц СИ. После включения соответствующих системных заголовков и заголовков для различных единиц СИ, которые нам понадобятся (все единицы СИ могут быть включены в<boost/units/systems/si.hpp>) и для количества I/O (<boost/units/io.hpp>), мы определяем функцию, которая вычисляет работу в джоулях, выполняемую с помощью силы в ньютонах на заданном расстоянии в метрах и выводит результат в<std::cout>. Класс<quantity>принимает второй параметр шаблона в качестве своего типа значения; этот параметр по умолчанию<double>, если не указано иное. Чтобы продемонстрировать простоту использования определяемых пользователем типов в размерных вычислениях, мы также представляем код для вычисления сложного импеданса с использованием<std::complex<double>>в качестве типа значения:
#include<complex>#include<iostream>#include<boost/typeof/std/complex.hpp>#include<boost/units/systems/si/energy.hpp>#include<boost/units/systems/si/force.hpp>#include<boost/units/systems/si/length.hpp>#include<boost/units/systems/si/electric_potential.hpp>#include<boost/units/systems/si/current.hpp>#include<boost/units/systems/si/resistance.hpp>#include<boost/units/systems/si/io.hpp>usingnamespaceboost::units;usingnamespaceboost::units::si;quantity<energy>work(constquantity<force>&F,constquantity<length>&dx){returnF*dx;// Defines the relation: work = force * distance.}intmain(){/// Test calculation of work.quantity<force>F(2.0*newton);// Define a quantity of force.quantity<length>dx(2.0*meter);// and a distance,quantity<energy>E(work(F,dx));// and calculate the work done.std::cout<<"F = "<<F<<std::endl<<"dx = "<<dx<<std::endl<<"E = "<<E<<std::endl<<std::endl;/// Test and check complex quantities.typedefstd::complex<double>complex_type;// double real and imaginary parts.// Define some complex electrical quantities.quantity<electric_potential,complex_type>v=complex_type(12.5,0.0)*volts;quantity<current,complex_type>i=complex_type(3.0,4.0)*amperes;quantity<resistance,complex_type>z=complex_type(1.5,-2.0)*ohms;std::cout<<"V = "<<v<<std::endl<<"I = "<<i<<std::endl<<"Z = "<<z<<std::endl// Calculate from Ohm's law voltage = current * resistance.<<"I * Z = "<<i*z<<std::endl// Check defined V is equal to calculated.<<"I * Z == V? "<<std::boolalpha<<(i*z==v)<<std::endl<<std::endl;return0;}
Намерение и функция вышеупомянутого кода должны быть очевидными; полученный результат:
Хотя эта библиотека пытается упростить кодирование простых размерных вычислений, она никоим образом не привязана к какой-либо конкретной системе единиц (SI или иным образом). Вместо этого он обеспечивает очень гибкую систему компиляции-времени для анализа размеров, поддерживая произвольные коллекции базовых измерений, рациональные силы единиц и явные преобразования количества. Все это достигается с помощью методов метапрограммирования шаблонов. С современными оптимизирующими компиляторами это приводит к нулевым накладным расходам времени выполнения для количественных вычислений относительно того же кода без проверки блока.
Статья Quick Start раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 40. Boost.Units 1.1.0 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.