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

Полиморфизм

Управление большим множеством разнообразных форм малым единообразным способом. Управление различными типами через единый интерфейс. Наличие непротиворечивого интерфейса является лучшим способом гарантировать, что код допускает повторное использование, и компоненты взаимодействуют качественно. Поскольку шаблоны C++ по сути не обрабатывают различные виды метаданных полиморфно, MPL следует за соглашением использования оберток типа вокруг метаданных не-типа. В частности числовые метаданные представлены как тип с вложенным числовымм константами, обозначаемыми как «::value».

Фундаментальная Теорема Разработки программного обеспечения (FTSE): любая проблема может быть разрешена с помощью внедрения дополнительного уровня абстракции (Батлер Лэмпсон).

Возможности свойств:

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

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

  • Специализация. можно менять результат работы шаблона свойств для определенных значений/типов, добавляя отдельную специализацию. Можно даже изменить результат целого диапазона «значений» (например, все указатели) при использовании частичной специализации. Специализация привносит особую гибкость в уровень динамики, посредством создания оберток для функций, так, например можно добавить «перегрузку» std::abs, который вызывается только когда его параметр - нечетное число.

  • Множественные возвращаемые значения. В то время как параметры обычных функций ассоциированы только с одним значением, у свойств часто есть больше чем один результат. Например, std::iterator_traits содержит пять вложенных типов (в пользовательской специализации их может быть сколько угодно).

Организация свойств в Boost:

В boost/ type_traits принято решение использовать только однозначные метафункции, тем самым избегая модели «блоб».

Результаты свойств имею следюущие обозначения:

  • Свойства значений: «::value»;

  • Свойства типов: «::type»;

Свойства обеспечивают механизм установки ассоциации между различными метаданными посредством специализаций шаблонных классов. Главная особенность идиомы свойст - это неинтрузивность (модульность, несвязанность отдельных частей, в противоположность модели «блоб», которая является интрузивной). Так, можно устанавливать новые ассоциации не затрагивая уже существующие. Метафункции MPL могут рассматриваться как особый случай свойств, где есть только одно значение результата для любого ввода.

В boost/ type_traits содержится несколько метафункций для низкоуровневого манипулирований типом. Например, результат add_reference всегда - ссылочный тип:

boost::add_reference<char>::type // char&

boost::add_reference<int&>::type // int&

В boost/ type_traits восновном используется булевские метафункции, которые позволяют определять фундаментальные свойства любого типа:

boost::is_reference<char>::value // false

boost::is_reference<int&>::value // true

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