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

Лямбда выражения

Описание

Лямбда выражение – вызываемая сущность времени компиляции, представленная в двух формах:

  • Метафункциональный класс;

  • Заполнители;

Требования к выражениям:

Смотри спецификации метафункционаьного класса и заполнителей.

Модели:

  • always

  • unpack_args

  • plus<_, int_<2> >

  • if_< less<_1, int_<7> >, plus<_1,_2>, _1 >

Смотри также:

Metafunctions, Placeholders, apply, lambda

Заполнители

Описание:

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

Требования к выражениям:

Если X - шаблонный класс, и a1, ..., an - произвольные типы, то X <a1,...,an> является заполнительным выражением, если и только если соблюдаются следующие условия:

  • По крайней мере один из аргументов шаблона a1,...,an является заполнителем или заполнительным выражением.

  • Все параметры шаблонного класса X, в том числе, используемые по умолчанию, являются типами.

  • Количество параметров шаблонного класса X, в том числе, используемые по умолчанию, меньше или равна значению макроса BOOST_MPL_LIMIT_METAFUNCTION_ARITY.

Модели:

  • _1

  • plus<_, int_<2> >

  • if_< less<_1, int_<7> >, plus<_1,_2>, _1 >

Смотри также:

Lambda Expression, Placeholders, Metafunctions, apply, lambda

Тэг диспетчеризированные метафункции

Описание:

Тэг диспетчеризированные метафункции – метафункции, которые используют теги диспетчеризации для переопределения/расширения поведения метафункции.

Нотация:

Символ

Легенда (условное обозначение)

name

Заполнительный маркер для конкретного имени метафункции.

tag-metafunction

Заполнительный маркер для тэга имени метафункции.

tag

Заполнительный маркер для одного из возможных типов тэга, возвращенных тэговой метафункцией.

Формат:

template< typename Tag > struct name_impl;

template< typename X [, ...] >

struct name

: name_impl< typename tag-metafunction <X>::type >::template apply<X [, ...] >

{};

template< typename Tag > struct name_impl

{

template< typename X [, ...] > struct apply

{

// default implementation

};

};

template<> struct name _impl<tag >

{

template< typename X [, ...] > struct apply

{

// tag-specific implementation

};

};

Описание:

Механизм для переопределения поведения метафункции - специализация шаблонного класса, что позволяет переопределять метафункции библиотеки, для некоторого пользовательского типа user_type, который имеет необходимую

семантику.

Более оптимальное решение для диспетчеризации поведения (особенно для родственных типов), например (list0, ..., list50, и др..).

Техника тэговой диспетчеризации основана на трех сущностей:

  • Метафункция;

  • Тэг, ассоциированный с тэговой метафункцией;

  • Реализация метафункции в виде метафункционального класса, параметризованного типом тэга.

Пример:

#include <boost/mpl/size.hpp>

namespace user {

struct bitset_tag;

struct bitset0

{

typedef bitset_tag tag;

// ...

};

template< typename B0 > struct bitset1

{

typedef bitset_tag tag;

// ...

};

template< typename B0, ..., typename Bn > struct bitsetn

{

typedef bitset_tag tag;

// ...

};

} // namespace user

namespace boost { namespace mpl {

template<> struct size_impl<user::bitset_tag>

{

template< typename Bitset > struct apply

{

typedef typename Bitset::size type;

};

};

}}

Модели:

  • sequence_tag

Смотри также:

Metafunction, Metafunction Class, Numeric Metafunction

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