C++ для начинающих Шаблоны классов Первое знакомство

Шаблоны — это автоподстановка типа. Иногда внутри классов выгодно использовать автоподстановку типа.
  • Шаблон класса позволяет использовать автоматически подставляемый тип внутри класса.
Напишем простой класс, суммирующий два значения. Предположительно мы совсем новички и даже не разделяем виды типов:

Всё прекрасно, мы справились, написали работающую программу. Но в один прекрасный момент нам понадобилось усовершенствовать программу так, чтобы она вычисляла не целые числа. Мы начинаем менять типы:

Мы снова радуемся. Вот оно, мы справились, всё заработало. Но наступает момент, когда к складываемым значением добавляется нечисловой тип. Для удобства понимания этим типом будет тип std::string. И тут нас ждёт простор реализаций… Во-первых, мы можем перегрузить функцию внутри класса:

Мы такие радуемся до поры до времени, программа работает правильно, и тут в один момент приходит необходимость складывать другой тип объектов. Мы думаем, и что же, это каждый раз нужно функции перегружать? Не, так не пойдёт, слишком напряжно. Думаем, такие, думаем и придумываем использовать шаблоны функции. И изменяем класс:

Код сократился, теперь нам нет нужды дёргаться лишний раз, если вдруг добавиться что-то новое, умеющее проводить операцию +. И живём мы некоторое время и пишем коды в подобном стиле, а потом нас осеняет одна идея: "А нельзя ли нам не указывать каждый раз функциям типы?. Ведь каждый вызов функции сопровождается явным указанием необходимых типов. Ведь с каждым новым ручным указанием типа повышается риск написать тип не тот. Так сказать, немного типом промахнуться и не успеть заметить. Думаем мы, как быть, думаем и понимаем, что если мы научим объект опозновать тип, то опознаваемый объектом тип можно без проблем подставлять в нужные функции. Преимущество научения объекта нужному типу в том, что объекту тип нужно отдать единожды, в противовес многократной подаче типа функциям. А что нам для этого нужно? Правильно, шаблонный класс! И переделываем мы программу, делая класс шаблонным:

Теперь мы можем создавать объекты под подходящие типы и от определённых для объектов типов отталкиваться. Обратите внимание, что мы избавились от шаблонности функции, подставляя туда тип, уже подставленный в объект.
  • Если вы создаёте многофайловую программу, то у Вас не получится разбить на файлы шаблонный класс и реализацию этого класса.
Если вы создаёте многофайловый проект, то и сам класс и его реализацию помещайте в один и тот же файл. Обычно файлу дают расширение .hpp, чтобы было понятно, что в файле реализован шаблонный класс.
Несмотря на то, что мы сейчас избавились от непосредственной шаблонности функции, не стоит думать, что шаблонные функции в шаблонном классе бесполезны. Ситуации возможны всякие, и наверняка кому-то придётся использовать в шаблонном классе шаблонные функции. Не забывайте, что статья ознакомительного характера для новичков, которым трудно понять, что даёт шаблонный класс или как написать шаблонный класс.
В качестве закрепления приведу пример создание класса, представляющего собой самый обычный массив, но массив с отслеживанием позиции. Если будет происходить попытка записи в недоступную массиву память, то запись просто не будет происходить.

В последнем приведнном примере показывается как выносить функции шаблонного класса за класс. Поскольку класс шаблонный, а функции вынесены во внешний классу мир, функции нужно делать шаблонными (хотя в нашем случае это не обычные шаблонные функции, а, наверное, классово-шаблонные). Таким образом получается, что в момеент зарождения объекта мы определяем обрабатываемый в классе тип, когда происходит обращение к функции класса, то объект подставляет определённый себе тип в свой функционал, там где он требуется, согласно описанию. В нашем случае востребован в том месте, где обозначено, что нужен будет подставляемый тип, условно тип обозначен буквой T, этот идентификатор можно менять на любое название, оно лишь только символизирует, что это некий тип. Внутри класса есть только объявление функции, а сама функция вынесена за класс. Вне класса функции нужно лишний раз напомнить, что она шаблонная и в неё подставляется тип. Иначе компилятор будет считать, что в месте T и не существующий, и не подставляемый, и вообще не тип, а непонятно что.
Если вам всё-таки придётся использовать шаблонные функции внутри шаблонных классов, то выделять из такого класса такие функции можно по вот такой формуле:

Получается что-то наподобие сдвоенного шаблона. Первый, сверху, это шаблон класса, чуть пониже — это шаблон, относящийся непосредственно к шаблонной функции. Тут нужно немного понимать что к чему соотносится. Для удобства я обозначил названия шаблонных параметров наиболее близкими по смыслу названиями: тип параметра функции и тип, подставляемый в класс объектом класса. Общая формула такая же как и обычная формула выноса функции за тело класса, но к этой общей формуле добавляется подстановка параметров, указываемых в угловых скобках и этот бутерброд шаблонности.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

7 комментариев: C++ для начинающих Шаблоны классов Первое знакомство

Добавить комментарий

Ваш e-mail не будет опубликован.

82 + = 88

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/igor-kvint/html-xhtml-i-css-na-100/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Программист на ночь ставит два стакана. Один - с водой, другой - без воды. Первый - на случай, если захочет пить, Второй - если не захочет.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок