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

Целочисленные обертки

Обертка int_ уже использовалась при анализе размерностей. Теперь мы можем исследовать эту обертку более подробно:

template<int N>

struct int_

{

static const int value = N;

typedef int_<N> type;

typedef int value_type;

typedef mpl::int_<N+1> next;

typedef mpl::int_<N-1> prior;

operator int() const { return N; }

};

Обертка int_ очень подобна bool _; фактически, единственное существенное различие – присутствие элементов «::next» и «::prior». Подобные обертки уже существуют, например std::size_t, известный как long_ и size_t соответственно.

Для создания обертки с любым типом параметра библиотека предоставляет обобщенную реализацию оберток:

template<class T, T N> // тип N

struct integral_c

{

static const T value = N;

typedef integral_c<T,N> type;

typedef T value_type;

typedef mpl::integral_c<T,N+1> next;

typedef mpl::integral_c<T,N-1> prior;

operator T() const { return N; }

};

Интегральные (целочисленные) обертки последовательностей, такие как шаблон vector_c , используют начальный параметр типа T, который применяется для специализаций их внутренних integral_c <T...>.

Нюанс: в библиотке представлены 2 схожие конструкции для интегральной обертки int_ <...> и integral_c <int...>, которе даже в случае содержания одинакового типа являются различными обертками.

Если попытаться сравнить две интегральные обертки:

boost::is_same<mpl::integral_c<int,3>, mpl::int_<3>>::value

Результат имеет значение false, следующее сравнение также дает false, что может вызвать удивление:

boost::is_same<mpl::long_<3>, mpl::int_<3>>::value

Обертка + внтуренний тип/значение = новые составной тип.

MPL предоставляет метафункцию equal_to для того, чтобы проверить равенство значений, содержащихся в обертках:

template<class N1, class N2>

struct equal_to

: mpl::bool_<(N1::value == N2::value)>

{};

Важно: не перепутайте equal_to с похожим названием equal, который сравнивает элементы двух последовательностей. Названия этих двух метафункций были взяты от таковых из подобных компонентов в STL.

Составные Операторы

MPL предоставляет целый набор метафункций для того, чтобы воздействовать на составные интегральные обертки (например, plus и minus).

Операторы разделена на четыре группы.

(В таблицах ниже, n = 5 по умолчанию. См. раздел Макроопределения MPL для информации о том, как изменить n.)

Операторы с булевым значением:

Метафункции этой группы все содержат константный результат bool -логические операторы:

Metafunction Specialization

::value and ::type::value

not_<X>

!X::value

and_<T1,T2,...Tn>

T1::value && ... Tn ::value

or_<T1,T2,...Tn>

T1::value || ... Tn ::value

Операторы для сравнения значений:

Metafunction Specialization

::value and ::type::value

equal_to<X,Y>

X::value == Y::value

not_equal_to<X,Y>

X::value != Y::value

greater<X,Y>

X::value > Y::value

greater_equal<X,Y>

X::value >= Y::value

less<X,Y>

X::value < Y::value

less_equal<X,Y>

X::value <= Y::value

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