![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
THE BOOST MPL LIBRARY: Representing DimensionsBoost , ,
|
Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Dimensional Analysis / Representing Dimensions |
Международный стандарт, называемый Système International d'Unites (SI), разбивает каждую величину на комбинацию размеров mass, length (или position), time, charge, temperature, intensity и angle. Чтобы быть достаточно общим, наша система должна быть в состоянии представлять семь или более фундаментальных измерений. Он также нуждается в способности представлять композиционные размеры, которые, как сила, построены через умножение или деление фундаментальных.
В общем, композитное измерение является продуктом сил фундаментальных измерений. [1] Если бы мы собирались представлять эти способности для манипулирования во время выполнения, мы могли бы использовать массив из семи ints, причем каждая позиция в массиве удерживала бы силу другого фундаментального измерения:
typedef int dimension[7]; // m l t ... dimension const mass = {1, 0, 0, 0, 0, 0, 0}; dimension const length = {0, 1, 0, 0, 0, 0, 0}; dimension const time = {0, 0, 1, 0, 0, 0, 0}; ...
[1] | Делители просто вносят отрицательные экспоненты, так как 1/x = x-1. |
В таком представлении сила была бы:
dimension const force = {1, 1, -2, 0, 0, 0, 0};
mlt-2. Однако, если мы хотим получить размеры в системе типов, эти массивы не будут делать трюк: они все одного типа! Вместо этого нам нужны типы, которые сами по себе представляют последовательности чисел, так что две массы имеют один и тот же тип, а масса отличается от длины.
К счастью, MPL предоставляет нам набор последовательностей типа . Например, мы можем построить последовательность встроенных подписанных интегральных типов таким образом:
#include <boost/mpl/vector.hpp> typedef boost::mpl::vector< signed char, short, int, long> signed_types;
Как мы можем использовать последовательность типов для представления чисел? Подобно тому, как численные метафункции проходят и возвращают обертку типов, имеющую вложенное ::значение, так и числовые последовательности на самом деле являются последовательностями типов обертки (другой пример полиморфизма). Чтобы упростить эту задачу, MPL предоставляет шаблон классов int_
#include <boost/mpl/int.hpp> namespace mpl = boost::mpl; // namespace alias static int const five = mpl::int_<5>::value;
Фактически, библиотека содержит целый набор интегральных константных оберток, таких как long_ и bool_, каждый из которых обертывает интегральную константу другого типа в шаблон класса.
Теперь мы можем построить наши фундаментальные измерения:
typedef mpl::vector< mpl::int_<1>, mpl::int_<0>, mpl::int_<0>, mpl::int_<0> , mpl::int_<0>, mpl::int_<0>, mpl::int_<0> > mass; typedef mpl::vector< mpl::int_<0>, mpl::int_<1>, mpl::int_<0>, mpl::int_<0> , mpl::int_<0>, mpl::int_<0>, mpl::int_<0> > length; ...
Вуу! Это довольно быстро утомит. Хуже того, трудно читать и проверять: Существенная информация, силы каждого фундаментального измерения, похоронена в повторяющемся синтаксическом шуме. Соответственно, MPL поставляет обертки интегральной последовательности , которые позволяют нам писать:
#include <boost/mpl/vector_c.hpp> typedef mpl::vector_c<int,1,0,0,0,0,0,0> mass; typedef mpl::vector_c<int,0,1,0,0,0,0,0> length; // or position typedef mpl::vector_c<int,0,0,1,0,0,0,0> time; typedef mpl::vector_c<int,0,0,0,1,0,0,0> charge; typedef mpl::vector_c<int,0,0,0,0,1,0,0> temperature; typedef mpl::vector_c<int,0,0,0,0,0,1,0> intensity; typedef mpl::vector_c<int,0,0,0,0,0,0,1> angle;
Несмотря на то, что они имеют разные типы, можно считать, что эти специализации mpl::vector_c эквивалентны более многословным версиям выше, которые используют mpl::vector.
Если мы хотим, мы также можем определить несколько составных измерений:
// base dimension: m l t ... typedef mpl::vector_c<int,0,1,-1,0,0,0,0> velocity; // l/t typedef mpl::vector_c<int,0,1,-2,0,0,0,0> acceleration; // l/(t2) typedef mpl::vector_c<int,1,1,-1,0,0,0,0> momentum; // ml/t typedef mpl::vector_c<int,1,1,-2,0,0,0,0> force; // ml/(t2)
И, кстати, размеры скаляров (например, пи) можно описать как:
typedef mpl::vector_c<int,0,0,0,0,0,0,0> scalar;
Статья THE BOOST MPL LIBRARY: Representing Dimensions раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |