- •Вычисления значений
- •Пример:
- •Вычисления типов
- •Преимущества мета подхода:
- •Польза использования mpl:
- •Числовая метафункция
- •Свойства
- •Метаданные
- •Специализация
- •Первичный шаблон:
- •Инстанцирование:
- •Метафункции
- •Полиморфизм
- •Возможности свойств:
- •Организация свойств в Boost:
- •Пример:
- •Типовые ассоциации
- •Альтернатива:
- •Метафункции Продвижение (пересылка) метафункций
- •Класс метафункции
- •Формат:
- •Числовые
- •Пример:
- •Нульарные
- •Метрический анализ (Анализ размерностей)
- •Метрики
- •Величины
- •Сложение и вычитание
- •Умножение
- •Класс метафункции
- •Деление
- •Пример:
- •Метафункции высшего порядка (Каскады вложенных вызовов)
- •Использование apply:
- •Заполнители
- •Безымянный заполнитель:
- •Определение выражений с заполнителями
- •Лямбда (Лямбда метафункции/выражения)
- •Частичное приложение метафункции
- •Лямбда и Шаблоны Неметафункции
- •Обертки
- •Выбор типа
- •Ленивый Выбор Типа
- •Логические Операторы
- •Целочисленные обертки
- •Составные Операторы
- •Операторы с булевым значением:
- •Операторы для сравнения значений:
- •Операторы для интегральных значений:
- •Побитовые операторы:
- •Арифметические операторы:
- •Целочисленная «стенография»
- •Интегральные последовательности
- •Формат:
- •Последовательности
- •Концепции
- •Итераторы
- •Двунаправленные
- •Произвольные
- •Последовательности
- •Двунаправленные
- •Произвольные
- •Расширенные
- •Ассоциативные
- •Требования
- •Расширения
- •Расширенные ассоциативные последовательности
- •Алгоритмы и последовательности
- •Итераторы
- •Равенство
- •Операции Внутренние операции с последовательностей
- •Наследование
- •Создание последовательности
- •Реализация:
- •Создание итератора
- •Преимущества полной специализации перед частичной:
- •Добавление расширения
- •Алгоритмы
- •Абстракция:
- •Stl алгоритмы
- •Детали правильного использования stl:
- •Mpl алгоритмы
- •Различия stl и mpl алгоритмов:
- •Пример:
- •Вставки
- •Пример 1:
- •Пример 2:
- •Пример 3:
- •Фундамент алгоритмов
- •Пример:
- •Запрашиваемые алгоритмы
- •Последовательности (Алгоритмы, создающие последовательности)
- •Синонимы функциональных алгоритмов:
- •Создание алгоритма
- •Итераторы «Просмотр» и итераторы-адаптеры
- •Концепция просмотра
- •Применение просмотра Сравнения значений элементов последовательности:
- •Объединение множественных (мульти-) последовательностей
- •Упрощение 1
- •Упрощение 2 (создание просмотра)
- •Уход от ненужного вычисления
- •Выборочная обработка элемента
- •Итератор-адаптер
- •Создание просмотра
- •Реализация итератора-адаптера для zip_view.
- •Диагностика
- •Отладка ошибок
- •Трассировка инстанцирования
- •Исправленный пример:
- •Форматы сообщений об ошибках
- •Блок «with»
- •Устранение параметров шаблона по умолчанию
- •Глубокий typedef
- •Инструменты
- •Несколько компиляторов
- •(Статические Утверждения)
- •Формат:
- •Формат:
- •Индивидуальные сообщения утверждений
- •Настройка предиката:
- •(Генерирование встроенных сообщений)
- •Формат:
- •Выбор стратегии:
- •Тип печати
- •Кросс этапность компиляции/выполнения
- •Печать типов:
- •Тип посещения:
- •Выбор реализаций
- •Специализация шаблонов классов
- •Тег диспетчеризации
- •Выбор структуры
- •Композиция классов
- •Указатели на функцию
- •Ослабление типизации
- •Пример:
- •Обобщение:
- •Динамический полиморфизм
- •Автоматизация
- •Сохранение интерфейса
- •Рекуррентный шаблон
- •Формат:
- •Генерирование функций
- •Управление разрешением перегрузки
- •Явное управление множеством перегрузки
- •Документация mpl Последовательности
- •Концепции
- •(Прямая последовательность)
- •(Двунаправленная Последовательность)
- •(Последовательность произвольного доступа)
- •(Расширенная последовательность)
- •(Расширенная последовательность начала)
- •(Расширенная последовательность конца)
- •(Ассоциативная последовательность)
- •(Расширенная ассоциативная последовательность)
- •(Обертка интегральной последовательности )
- •(Переменная последовательность)
- •Представления
- •Метафункции (Внутренние)
- •Итераторы
- •Концепции
- •(Прямой итератор)
- •(Двунаправленный итератор)
- •(Итератор произвольного доступа)
- •Метафункции
- •Алгоритмы
- •Концепции
- •(Инсертер: механизм вставок)
- •Инсертеры (инсертер: механизм вставок)
- •Итеративные алгоритмы
- •Запрашиваемые алгоритмы
- •Преобразования
- •Метафункции
- •Концепции Метафункция
- •Метафункциональный класс
- •Лямбда выражения
- •Заполнители
- •Тэг диспетчеризированные метафункции
- •Числовые метафункции
- •Тривиальные метафункции
Заполнители
(Placeholders)
Заполнители – это класс метафункции mpl::Arg<X>.
Реализация:
Удобные имена «_1», «_2»,...,«_5» являются синонимами для специализаций mpl::Arg<X>, которые определяются по N-му аргументу.
(См. раздел Макроопределения для описания того, как изменить количество поддерживаемых заполнителей.)
namespace boost{
namespace mpl{
namespace placeholders{
template <int N> struct arg; // forward declarations
struct void_; // Признак отсутствия
template <> struct arg<1>
{
template < class A1, class A2 = void_, ..., class Am = void_>
struct apply
{
typedef A1 type; // return the first argument
};
};
// Создаем синоним:
typedef arg<1> _1;
template <>
struct arg<2>
{
template<class A1, class A2, class A3 = void_, ..., class Am = void_>
struct apply
{
typedef A2 type; // return the second argument
};
};
// Создаем синоним:
typedef arg<2> _2;
//more specializations and typedefs...
}
}
}
Вызов класса метафункции эквивалентно вызову вложенной метафункции класса. Когда заполнитель вычиляется в лямбда выражении, он вызывается с фактическим аргументом, возвращая конкретное значение специализации.
Безымянный заполнитель:
Определение:
namespace boost{
namespace mpl{
namespace placeholders{
typedef arg<-1> _; // the unnamed placeholder
}
}
}
Неодходим для специальных режимов. Когда лямбда выражение преобразовывается в класс метафункции mpl::lambda, то такой заполнитель выступает в качестве счетчика, посредством замены безымянного заполнителя на значение конкретной специализации.
Семантика заполнителей:
mpl::plus<_,_> |
mpl::plus<_1,_2> |
boost::is_same< _, boost::add_pointer<_> >
|
boost::is_same< _1, boost::add_pointer<_1> >
|
mpl::multiplies< mpl::plus<_,_>, mpl::minus<_,_> >
|
mpl::multiplies< mpl::plus<_1,_2>, mpl::minus<_1,_2> >
|
Определение выражений с заполнителями
Выражение заполнителя – это заполнитель или специализация шаблона по крайней мере с одним аргументом, который является выражением заполнителя, т.е. выражение заполнения всегда использует заполнители.
// find the position of a type x in some_sequence such that:
// x is convertible to 'int'
// && x is not 'char'
// && x is not a floating type
typedef mpl::find_if
<
some_sequence,
mpl::and_
<
boost::is_convertible<_1, int>,
mpl::not_<boost::is_same<_1, char>>,
mpl::not_<boost::is_float<_1>>
>
>::type iter;
Реализуем вложенные вызовы для выражений с заполнителями, в идеале, это должно работать аналогично mpl::transform позволяя передавать любые формы:
template <class X>
struct two_pointers : twice<boost::add_pointer<_1>, X>{};
Но, текущая реализация add_poiner не позволит выполнить это.
template <class T>
struct add_pointer
{
typedef T* type;
};
Чтобы быть вызванным дважды add_pointer <_1> должен быть классом метафункции вроде add_pointer_f. Вместо этого нульарная метафункция будет возвращать безсмысленное «_1*». Любая попытка использовать two_pointers потерпит неудачу, когда apply_helper достигнет вложенного «::apply» в теле add_pointer <_1>» оно не будет обнаружено, т.к. в нем содержится лишь «::type». Проблема в том, что необходим универсальный посредник, который будет классом для метафункции наподобии add_pointer <Т>.
Решение: лямбда метафункции
