Вы находитесь на странице: 1из 18

Алгоритмизация

и
программирование
Шаблоны функций
Шаблоны классов
Шаблоны функции

Шаблон функции – определяет алгоритм,


который будет применяться к данным различных типов, а конкретный тип данных
передается функции в виде параметра на этапе компиляции.

Компилятор автоматически генерирует правильный код, соответствующий


переданным параметрам.

Так создается функция, которая автоматически перегружает сама себя и не содержит


накладных расходов связанных с параметризацией.

2
Формат функции-шаблона :

template <параметры шаблона>


заголовок_функции
{
/* тело функции */
}

В общем случае – параметров несколько. Это может быть:


• тип (встроенный или пользовательский),
• нетиповый параметр - константы времени компиляции ( целые числа, указатели или
ссылки на статические данные)
• другой шаблон

3
Шаблон класса == параметризованный тип == шаблонный класс

Параметризованный класс –описывает семейство родственных классов, которые


можно использовать для любых типов данных.
Типы данных передаются через параметры.

Шаблоны – для реализации контейнерных классов.


Контейнерный класс – предназначен для хранения каким –либо образом
организованных данных и работы с ними.
Типы данных – параметры для объявлении объекта.

4
Формат шаблона класса :

template <параметры шаблона>


class имя
{
/* определение класса*/
}

В общем случае – параметров несколько (через запятую). Это может быть:


• тип (встроенный или пользовательский),
• нетиповый параметр - константы времени компиляции ( целые числа, указатели или
ссылки на статические данные)
• другой шаблон

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 <описание параметров шаблона>


возвращаемый_тип имя_класса <параметры шаблона> ::
имя_функции (список параметров функции)

)
template <class Array>
void Array <Data> ::
print ()
{/* тело метода */}

Шаблоны - в заголовочных файлах.

8
Правила описания шаблонов.

1. Шаблоны не могут быть виртуальными


2. Шаблоны классов могут содержать статические элементы, дружественные классы и
функции.
3. Шаблоны могут быть производными как от шаблонов, так и от обычных классов.
4. Внутри шаблона нельзя определять дружественные шаблоны.
5. Локальные классы не могут содержать шаблоны в качестве своих элементов.

9
Использование шаблонных классов
Инстанцирование шаблона – создание конкретного объекта конкретного класса.
(этап компиляции).

имя_шаблона <аргументы> имя_объекта [(параметры конструктора)];

Array <int> a;
Array <double> b (10);
Программа с шаблонами содержит код для каждого порожденного типа → увеличивает
размер исполняемого файла.

10
Параметры шаблона, не являющиеся типами
1. Интегральный (целочисленный, символьный, булевский) и перечислимый тип
2. Указатель на объект или функцию
3. Ссылка на объект или функцию
4. Указатель на элемент класса
5. Стандартный тип нулевого указателя (std::nullptr_t)

Нельзя использовать вещественный тип – параметр - можно указатели или ссылки на


вещественные.
Параметры могут применяться везде, где допустимо константное выражение.

11
При использовании параметров по умолчанию - <>

template <class Data = int>


class Array {
...
}
Array <> c (10);

12
После создания объекта с помощью шаблона – как с объектами обычных классов.

Можно использовать переименования типов.

typedef Array<double> ArrayDouble;

ArrayDouble b (10);

13
Зависимые имена
Иногда нужно воспользоваться типами или псевдонимами типов, определёнными
внутри шаблонных параметров.
В таких случаях требуется указать компилятору, что мы используем именно тип, а не
свойство или метод.

В примере ниже iterator является типом, определённым внутри типа параметра


Container.

template <class Container>


void foo(const Container & data)
{
// слово typename обязательно для использования типа
typename Container::iterator item = data.begin();

}

14
Специализация шаблона
1. Каждая функция шаблона - одинаковый базовый код – изменяются только
параметры.
2. Некоторые шаблоны могут работать не со всеми типами эффективно. Если для
какого-то типа существует более эффективный код, можно сделать для этого типа
специализацию отдельных методов или полностью переопределить шаблон класса.
3. Для специализации метода – в заголовке указывается конкретный тип данных.

void Array<char>::print() {
/* тело метода */
}

15
Шаблоны – мощное и эффективное средство работы с различными типами данных ==
параметрическим полиморфизм.
Помним:
1. Программа с шаблонами содержит полный код для каждого порожденного типа,
может увеличивать объем программы.
2. С некоторыми типами данных шаблоны могут работать не так эффективно, как с
другими. Специализация шаблона для этих типов.

16
Компиляция

Можно использовать подход трех файлов:


Определение шаблона класса хранится в заголовочном файле. Array.h
Определения методов шаблона класса хранятся в отдельном файле .cpp. Array.cpp
Затем добавляем третий файл, который содержит все необходимые нам экземпляры
шаблона класса templates.cpp

17
18

Вам также может понравиться