Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
template_metaprogramming_ru.docx
Скачиваний:
12
Добавлен:
01.07.2025
Размер:
774 Кб
Скачать
☆

Метрики

Международный стандарт под названием Système International d'Unites (СИ -Система Интернациональная: международная метрическая система физических величин) представляет каждую величину как комбинацию следующих размерностей:

  • Масса;

  • Длины или позиции;

  • Время;

  • Заряд;

  • Температура;

  • Интенсивность;

  • Угол.

(См. http://ru.wikipedia.org/wiki/%D0%A1%D0%98)

Чтобы обобщить эти единицы, система должна была бы быть в состоянии представить семь или больше фундаментальных размерностей. Необходимо также выражать составные размерности, такие как сила, созданые посредством умножения или разделения фундаментальных.

Составная размерность – результат взаимодействия фундаментальных размерностей. Если бы мы собирались выразить эти взаимодействия на этапе выполнения, то могли бы использовать массив int из семи элементов, по одному для каждой фундаментальной размерности:

Деления 1/х записываются в виде отрицательной степени х-1;

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};

//...

При таком подходе, сила будет выражена как:

dimension const force = {1, 1, -2, 0, 0, 0, 0}; // m*l/t2 == (m*l)-t2

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

MPL предоставляет набор последовательностей типов, что решает данную проблему.

Например, мы можем создать последовательность встроенных целочисленных типов:

#include <boost/mpl/vector.hpp>

typedef boost::mpl::vector<signed char, short, int, long> signed_types;

Последовательность типов можно использовать подобно последовательностям значений с помощью числовых метафункций, которые передают и возвращают типы в обертках, имеющих вложенные значения «::value», таким образом, числовые последовательности – на самом деле это последовательности типов в обертках.

MPL предоставляет для этого различные обертки, например для целых чисел int_<N>, которая содержит целочисленную константу в элементе «::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

Теперь можно определить несколько составных размерностей:

// 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; // m*l/t

typedef mpl::vector_c<int,1,1,-2,0,0,0,0> force; // m*l/(t2)

Размерности скаляров (таких как пи) могут быть описаны как:

typedef mpl::vector_c<int,0,0,0,0,0,0,0> scalar;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]