и
программирование
Шаблоны функций
Шаблоны классов
Шаблоны функции
2
Формат функции-шаблона :
3
Шаблон класса == параметризованный тип == шаблонный класс
4
Формат шаблона класса :
5
template <class Data> .
class Array { class Array {
public: public:
Array (): size_(0), data_(nullptr) Array (): size_(0), data_(nullptr)
{} {}
Array (size_t size): Array (size_t size):
size_(size), data_(new int[size]) size_(size), data_(new Data[size])
{} {}
~Array() { delete [] data_; }; ~Array() { delete [] data_; };
size_t getSize () const;
size_t getSize () const; Data & operator[] (size_t index) const;
int & operator[] (size_t index) const; private:
private: size_t size_;
size_t size_; Data * data_;
int * data_; };
};
6
Для любых параметров могут быть значения по умолчанию.
Параметр-тип шаблона состоит из ключевого слова class или typename (в списке параметров
они эквивалентны).
7
Если метод описывается за пределами класса:
)
template <class Array>
void Array <Data> ::
print ()
{/* тело метода */}
8
Правила описания шаблонов.
9
Использование шаблонных классов
Инстанцирование шаблона – создание конкретного объекта конкретного класса.
(этап компиляции).
Array <int> a;
Array <double> b (10);
Программа с шаблонами содержит код для каждого порожденного типа → увеличивает
размер исполняемого файла.
10
Параметры шаблона, не являющиеся типами
1. Интегральный (целочисленный, символьный, булевский) и перечислимый тип
2. Указатель на объект или функцию
3. Ссылка на объект или функцию
4. Указатель на элемент класса
5. Стандартный тип нулевого указателя (std::nullptr_t)
11
При использовании параметров по умолчанию - <>
12
После создания объекта с помощью шаблона – как с объектами обычных классов.
ArrayDouble b (10);
13
Зависимые имена
Иногда нужно воспользоваться типами или псевдонимами типов, определёнными
внутри шаблонных параметров.
В таких случаях требуется указать компилятору, что мы используем именно тип, а не
свойство или метод.
14
Специализация шаблона
1. Каждая функция шаблона - одинаковый базовый код – изменяются только
параметры.
2. Некоторые шаблоны могут работать не со всеми типами эффективно. Если для
какого-то типа существует более эффективный код, можно сделать для этого типа
специализацию отдельных методов или полностью переопределить шаблон класса.
3. Для специализации метода – в заголовке указывается конкретный тип данных.
void Array<char>::print() {
/* тело метода */
}
15
Шаблоны – мощное и эффективное средство работы с различными типами данных ==
параметрическим полиморфизм.
Помним:
1. Программа с шаблонами содержит полный код для каждого порожденного типа,
может увеличивать объем программы.
2. С некоторыми типами данных шаблоны могут работать не так эффективно, как с
другими. Специализация шаблона для этих типов.
16
Компиляция
17
18