В нашем предыдущем курсе, в Жёлтом поясе, поясе по C++, мы с вами уже изучили шаблоны функций и мы говорили, что шаблоны функции помогают избежать дублирования кода в тех функциях, которые отличаются только типами своих аргументов или типом возвращаемого значения. В этом модуле мы с вами изучим шаблоны класса. И шаблоны класса решают ту же самую задачу. Они позволяют избежать дублирования кода в классах, которые отличаются только типами своих полей или же параметров своих методов, или типами возвращаемых значений в методах. Простейший пример шаблона класса — это пара. Давайте мы с вами на время забудем о том, что существует стандартная пара, и рассмотрим такой пример. Вот нам по какой-то причине понадобилось написать структуру, у которой есть два поля, например, string и int. И что мы пишем? Мы пишем struct PairOfStringAndInt. И говорим, что у нас есть string first и int second. И вот как-то мы этой парой пользуемся. Мы её объявили. first присвоили Hello, и second, например, присвоили 5. Вот так мы этой парой пользуемся. Потом у нас как-то проект развивается, мы пишем код дальше, мы понимаем, что нам нужна ещё пара. Нам нужна пара, например, из логического значения и символа. Мы пишем PairOfBoolAndChar. У нас здесь появляется bool first и char second. И точно так же мы её объявляем bool and char. И работаем с её полями first и second. Ну и понятно, что когда у нас возникает необходимость в каких-то новых сочетаниях типов, нам приходится каждый раз объявлять новую структуру, давать ей какое-то имя и объявлять в ней поля нужных нам типов. И, соответственно, что мы видим? Мы видим, что вот эти два класса PairOfStringAndInt и PairOfBoolAndChar, они структурно одинаковые, но только отличаются типами своих полей. И поэтому вместо них мы можем написать шаблон класса. Шаблон класса так же, как и шаблон функции, начинается с ключевого слова template, дальше в угловых скобках мы указываем шаблонные параметры, мы пишем typename T и typename U. Всё, мы написали эти строчки, и теперь мы пишем класс struct Pair. И внутри этого нашего класса мы можем использовать парметры, в данном случае T и U, как типы. Мы пишем T first U second. И таким образом мы с вами только что написали простейший шаблон класса пара. Как им пользоваться? Пользоваться им очень просто. Мы берём и в нашей вот программе, в данном случае в функции main, пишем в угловых скобках Pair и здесь через запятую мы перечисляем типы, которыми мы хотим воспользоваться в данном шаблоне. И здесь мы делаем то же самое: bool char. Компилируем наш код. И наш код компилируется. Нам там компилятор жалуется, что мы не используем переменную bc, но сейчас это не важно. Собственно, мы с вами только что написали шаблон класса Pair и с помощью него создали два класса: Pair string int и Pair bool char. Что тут важно отметить? Что Pair — это шаблон класса, а вот эта вещь Pair от string и int — это уже класс, то есть это самостоятельный тип. Таким образом, мы в этой программе из шаблонов класса Pair создаём два класса, два типа. Pair от string и int и Pair от bool и char. И это создание типа из шаблона класса называется инстанцирование. И мы будем использовать этот термин дальше в модуле про шаблоны классов. Таким образом, давайте с вами подведём итоги этого краткого вводного видео. Мы с вами узнали, что в C++ есть не только шаблоны функции, но и шаблоны класса, которые также решают задачу борьбы с дублированием кода. Чтобы объявить шаблон класса, нужно написать ключевое слово template, дальше в угловых скобках перечислить шаблонные параметры и дальше написать слово class или struct, имя класса и дальше просто объявить класс. Шаблонов параметров у нас может быть несколько. Вот в примере с парой у нас было два. Здесь сейчас приведён пример шаблона Widget с одним параметром. Чтобы создать класс из шаблона нужно в угловых скобках указать типы, с которыми этот шаблон инстанцируется. Собственно, мы сказали, что создание класса из шаблона называется инстанция.