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

THE BOOST MPL LIBRARY: Representing Dimensions

Boost , ,

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

Front Page / Tutorial: Metafunctions and Higher-Order Metaprogramming / Dimensional Analysis / Representing Dimensions

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_, который представляет свой интегральный аргумент в виде вложенного ::value:

#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.




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



:: Главная :: ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 06:03:17/0.0081748962402344/1