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

Специализация

Работа со специализациями сопряжена с двумя основными моментами:

  • Обращение к шаблонному классу передавая ему в качестве аргумента конкретный тип:

  • Явная (полная) и частичная специализации; Синтаксис явной специализации:

template <variable part>

struct template-name<fixed part>

В явной (или полный) специализация, variable part -остается пустой, а fixed part заполняется конкретными аргуменатми шаблона, тип которых соответсвует в списке параметров.

В частичной специализации variable part содержит список параметров, и по крайней мере один параметр в fixed part зависит от параметров из variable part.

Первичный шаблон:

Объявление шаблона, который не является специализацией - основной шаблон. Основной шаблон можно расматривать как вариант по умолчанию, для работы с общими случаями, в то время как специализации обрабатывают особые ситуации.

Инстанцирование:

Фактическое заполнение шаблонных параметров конкретными типами, с генерированием отдельной версии данного шаблона (обычно располагается в конце единицы трансляции), на этом этапе происходит выбор оснонвой или специализированной версии шаблона, осуществляется дополнительная проверка на ошибки. Нюанс: тела функций- шаблонных классов не проверяются до момента инстанцирования – фактического использования:

template <class T, class U>

struct X

{

int f(T* x) // declaration

{

U y[10]; // definition

return 0;

}

};

typedef X<int&, char> t1; // OK; no instantiation yet

t1 x1; // error: int&* - illegal

typedef X<int, char&> t2; // OK; declarations check out

t2 x2; // ОК, но ошибка в теле функции шаблонного класса не обнаружена

int a = x2.f(); // error: array of char& illegal

Т.о., от шаблонное инстанцирование влияет как на скорость компиляции, так и на то, что компиляция вообще будет выполнена.

Метафункции

«Функция», которая работает с метаданными и может быть «вызвана» во время компиляции:

some_metafunction<Arg1, Arg2>::type

Аналогичный вызов на этапе выполнения:

some_function(arg1, arg2)

Числовая метафункция

Метафункция, которая возвращает тип обертки для численного значения. Большинство числовых метафункций содеражт вложенный элемент «::value»:

some_numerical_metafunction<Arg>::value

Вместо более общего

some_numerical_metafunction<Arg>::type::value

Для доступа к числовому результату непосредственно.

Свойства

(Traits)

Метаданные

Все «значения/типы», с которыми ведется работа на этапе компиляции. Два наиболее распространенных вида: типы и целочисленные константы (включая bool). Часть времени компиляции C++ часто упоминается как «чистый функциональный язык», потому что метаданные являются неизменными, и у метафункций не может быть никаких побочных эффектов.

Блоб

Класс с большим количеством элементов (включая функции класса). Элементы такого класса все «связаны» с друг другом, потому что они объявляются вместе. Это ограничивает приницпы полиморфизма, сужает модульность, потому такой модели лучше избегать, альтернатива: boost::свойства и метафункции.

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