- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Числовые метафункции
Описание:
Числовая метафункция является тэг диспетчеризированной метафункцией, что обеспечивает инфраструктуру для легкой реализации операци смешанного типа.
Требования к выражениям:
В следующей таблице и спецификациях, op - заполнительный маркер для текущей числовой метафункции, а х, у и x1, x2, ... хn - произвольные числовые типы.
Выражение |
Тип |
Сложность |
op_tag<x>::type |
Интегральная константа |
Амортизированное постоянное время. |
op_impl< op_tag<x>::type, op_tag<y>::type >::apply<x,y>::type |
Любой тип |
Не определено. |
op<x1,x2,... xn>::type |
Любой тип |
Не определено. |
Семантика выражений:
typedef op_tag<x>::type tag;
Семантика: tag – тип тэга для x и op, tag::value – ранг преобразования x.
typedef op_impl<
op_tag<x>::type,
op_tag<y>::type
>::apply<x,y>::type r;
Семантика: r – результат работы op, с аргументами x и y.
typedef op<x1,x2,... xn>::type r;
Семантика: r – результат работы op, с аргументами x1, x2,…, xn.
Пример:
struct my_complex_tag : mpl::int_<10> {};
template< typename Re, typename Im > struct my_complex
{
typedef my_complex_tag tag;
typedef my_complex type;
typedef Re real;
typedef Im imag;
};
template< typename T > struct my_real : T::real {};
template< typename T > struct my_imag : T::imag {};
namespace boost { namespace mpl {
template<>
struct plus_impl< my_complex_tag, my_complex_tag >
{
template< typename N1, typename N2 >
struct apply : my_complex<
plus< typename N1::real, typename N2::real >,
plus< typename N1::imag, typename N2::imag >
>
{};
};
}}
int main()
{
typedef my_complex< mpl::int_<5>, mpl::int_<-1> > c1;
typedef my_complex< mpl::int_<-5>, mpl::int_<1> > c2;
typedef mpl::plus<c1,c2> r1;
BOOST_MPL_ASSERT_RELATION( my_real<r1>::value, ==, 0 );
BOOST_MPL_ASSERT_RELATION( my_imag<r1>::value, ==, 0 );
typedef mpl::plus<c1,c1> r2;
BOOST_MPL_ASSERT_RELATION( my_real<r2>::value, ==, 10 );
BOOST_MPL_ASSERT_RELATION( my_imag<r2>::value, ==, -2 );
typedef mpl::plus<c2,c2> r3;
BOOST_MPL_ASSERT_RELATION( my_real<r3>::value, ==, -10 );
BOOST_MPL_ASSERT_RELATION( my_imag<r3>::value, ==, 2 );
return 0;
}
Модели:
plus
minus
times
divides
Смотри также:
Tag Dispatched Metafunction, Metafunctions, numeric_cast
Тривиальные метафункции
Описание:
Тривиальные метафункции принимают один аргумент классового типа х и возвращают вложенный в х элемент x::name, где name - маркер заполнитель для текущего имени элемента доступного определенному экземпляру метафункции.
По соглашению, все тривиальное метафункции в MPL именуются после соответствующих элементов, доступ к которым они предоставляют. Например, доступ к тривиальной метафункции first класса x, выглядит как x::first.
Требования к выражениям:
В следующей таблице и спецификациях, name - заполнительный маркер для имен тривиальной метафункции и доступного элемента, х - классовый тип такой, что х::name – действительное имя типа.
Выражение |
Тип |
Сложность |
name<x>::type |
Любой тип |
Постоянное время. |
Семантика выражений:
typedef name<x>::type r;
Предусловие: x::name – действительное имя типа.
Семантика:
is_same<r,x::name>::value == true.
Модели:
first
second
base
Смотри также:
Metafunctions, Trivial Metafunctions, identity
