С++. Аргументы по умолчанию у шаблонов класса.

В шаблонах классов (но не в шаблонных функций) существует понятие аргумент(ы) шаблона по умолчанию. Работает это по аналогии с аргументами по умолчанию обычных функций.


Параметры по умолчанию в шаблонных классах действуют точно по такому же принципу. Сейчас может быть немного тяжеловато. Для примера выбраны контейнеры STL (в старых компиляторах STL нет), но более менее наглядно можно показать используя STL. Не хочу описывать 2 класса-велосипеда, поэтому выбор для описания именно такой, какой он есть.
Итак, делаю класс MyClass, внутри которого размещаю обычную функциональность для работы с вектором. Вот основа для дальнейшего разбора. Это чтобы видно было, от чего отталкиваться будем.

Вот такой вот класс (листинг #2) превратим в шаблонный класс и установим шаблонный аргумент по умолчанию для него.

Такой вот код. В начале шаблонному классу был скормлен только один параметр. Этот параметр пришёл в первый аргумент, в T. Второй параметр мы не отдавали, но в шаблонном классе второй аргумент описан как аргумент по умолчанию, поэтому если мы не отдаём в него параметров, он автоматически присваивает себе то значение, которое ему указано. Так, в этом примере, аргументу по умолчанию было указано, чтобы он принимал тип vector (Вектор, хранящий целые числа). Так и вышло, что в объекте класса MyObj1 образовался вектор для целочисленных значений, в который мы стали записывать данные.
Во втором же случае вторым аргументом в угловых скобках было указано, что второй параметр — это deque, хранящий данные, тип у которых string, а следовательно во второй аргумент шаблонного класса пришёл именно этот deque, он перекрыл тот тип, который был указан по умолчанию. Своего рода захватчик. Поэтому во втором случае в объекте класса образовалась очередь deque, хранящая данные, тип у которых string.
Попробуем создать еще один объект:


Не получится ни на первый случай, ни на второй. В первом случае мы пытаемся записать в очередь deque, предназначенную для хранения int значения с типом string, но нельзя произвести такую запись в С++ простым образом. Во втором случае мы пытаемся записать целое число с типом int в объект-вектор, предназначенный для хранения string, но нельзя произвести такую запись простым образом, нужны дополнительные телодвижения, описывающие конвертацию строки в число. Всё это значит, что нужно следить за типами.
В STL и у std::vector и у std::deque есть одноименный метод: push_back(). Кто незнаком с STL и это не очень понятно, можете считать, что есть два независимых класса. В этих классах есть метод с одинаковым названием. Благодаря тому что в двух независимых классах есть одноимённый метод, выполняющий одну и ту же задачу, мы можем легко производить подмену классов, что и было использовано при демонстрции листинга #3.
Пример я старался показать максимально простой. Но он может сложнее восприниматься, чем мог бы. Буду надеяться, что изложил достаточно доступно.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/denis-kolisnichenko/php-5-6-i-mysql-6-razrabotka-web-prilozheniy/?lfrom=15589587
Яндекс.Метрика