Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Методы и стандарты
программирования
• Шаблонные функции
• Шаблонные классы
Шаблонные функции. Основные понятия
Шаблонная функция с одним обобщённым типом
Шаблонная функция (обобщенная функция,
template function) определяет общий набор
операций, которые предназначены для
применения к данным различных типов.
Шаблонная функция перегружает сама себя
Здесь обобщённый тип Ttype – заполнитель
(placeholder) для типа данных,
обрабатываемых функцией. При
определении функции и в её параметрах
вместо «перегружаемого» типа используется
Ttype
При вызове шаблонной функции, компилятор
создает версию этой функции для
конкретного типа, т.е. создается ее
специализация (конкретизация, порожденная
функция (generated function). При этом
вместо плэйсхолдера подставляется
необходимый тип
Действие порождения функции определяют
как ее реализацию (instantiating)
Шаблонная функция с двумя обобщёнными типами
Шаблонные функции. Компиляция
Сама по себе шаблонная функция не является ни функцией, ни типом.
Если не была создана хотя бы одна специализация (т.е. никак не были
определены шаблонные типы), она и вовсе не компилируется, т.е.
никак не отображается из исходного кода в объектный код
Использование шаблонов может замедлять компиляцию, но не
выполнение
Можно проверить данный факт с помощью утилиты nm, которая
выводит таблицу символов объектного файла. Таблица символов –
структура данных, содержащаяся в объектном файле, которая
сопоставляет имена символов из исходного кода с их бинарным кодом.
Если бинарного кода для функции нет в объектном файле, nm не
покажет её имя
g++ -c main.cpp –o main.o
nm main.o
Шаблонные функции. Вывод типа
Как правило, при инстанциировании шаблонной функции компилятор может
сам вывести шаблонный тип исходя из типов переданных данной функции
параметров (type deduction). Благодаря этому возможны такие конструкции,
как std::cout << “Hello World!”
В некоторых случаях компилятор не способен самостоятельно вывести тип.
Например:
•
У шаблонной функции нет параметров
•
Параметрам одного и ого же шаблонного типа переданы значения
разных типов (например, int и long)
•
Необходимо «навязать» параметрам преобразование типов
В таком случае при вызове шаблонной функции необходимо задать тип в
явном виде в треугольных скобках после имени функции
Шаблонные функции. Явная специализация
Если необходимо определить отдельную реализацию шаблонной функции
для некоторых типов, можно переопределить такую функцию вручную. Это
явная специалиазция шаблона (implicit specialization)
Вариант 1
Вариант 2
Варианты синтаксиса
явной специализации
(1) и (2) равнозначны,
однако (2) часто
считается более
препочтительным,
поскольку он в явной
форме показывает, что
данная функция
является
специализацией
шаблона
Шаблонные классы
Объявление класса
Шаблонные классы объявляются аналогично шаблонным функциям
Структуры данных из STL (std::vector, std::queue и др) – шаблонные
классы
Бинарный код для шаблонных классов, так же как и для
шаблонных функций, генерируется только при создании
специализации. При компиляции .cpp файла, в котором создаётся
специализация, компилятор «не помнит» о том, что он «видел» при
компиляции другого .cpp файла, где определены функции-члены
класса
Два варианта решения проблемы:
Создание объекта
1) Функции-члены шаблонного класса должны быть определены в заголовочном файле
2) Поместить в .cpp файл явную специализацию для необходимого типа:
template class Foo;
Шаблонны. Формальные параметры
Параметры-типы
Шаблонные классы и функции могут иметь типы по
умолчанию.
Если формальный параметр шаблона имеет значение по
умолчанию, то все следующие за ним параметры также
должны иметь значения по умолчанию.
При создании объекта шаблонного класса с использованием типа по умолчанию необходимо добавить
«<>» после имени класса, чтобы указать компилятору, что к данный класс является шаблонным.
Параметры-значения
Шаблоны могут принимать параметры-значения (только
целочисленных типов, перечисления (enum), указатели и
nullptr, lvalue-ссылки). В этом случае шаблон производит
вычисления с данным значением во время компиляции.
Шаблонны. Формальные параметры
Параметры-шаблоны
Позволяют параметризовать один шаблон другим шаблоном
Тоже могут быть заданы по умолчанию
Шаблонный класс с одним типовым формальным параметром и
одним шаблонным формальным параметром со значением по
умолчанию