Разработка программного обеспечения раньше требовала огромных сил. С развитием языков программирования соответствующий процесс стал значительно проще. Появились различные синтаксисы, при помощи которых удается создавать качественное ПО. Наиболее популярными являются языки, относящиеся в СИ-семейству (C#, C, C++). Они выступают не только самыми известными, но и функциональными.

Далее предстоит рассмотреть такой элемент программирования, как шаблоны в C и C++. С их помощью удается намного быстрее генерировать классы, а также разнообразные функции. Представленная информация в большей степени ориентирована на опытных программистов. Материалы пригодятся также тем, кто уже умеет писать элементарные приложения.

Определение

Шаблон – компонент, используемый для быстрой генерации новых классов и функций, имеющих один и тот же функционал. Иногда соответствующие элементы называются обобщенными или родовыми.

В качестве параметров шаблона класса int выступает тип. Реже – значения записанных разработчиком типов.

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

Методы классов могут выступать в качестве шаблона функции. Для этого их необходимо грамотно внедрить в исходный программный код. Методы template class – это и есть шаблоны.

Рассматриваемый компонент дает возможность оперировать данными разных типов (int и не только). Привязка к некоторому конкретному типу информации отсутствует. Работа выполняется над некоторым обобщенным информационным типом, а не над int и ему подобными компонентами. Соответствующий «обобщенный» элемент должен иметь имя. Пример – тип T.

Объявление шаблона класса – это описание. Создание реального класса с заданным типом информации будет производиться компилятором. Операция осуществляется в момент компиляции при объявлении классового объекта.

Преимущества

Class template дает некоторые преимущества при разработке приложения:

  1. Избегание повторяемости написания программного кода для разных типов (int, void, double и так далее). Программный код вместе с методами и функциями будет написан для некоторого обобщенного типа T. В качестве «названия» обобщенного типа может выступать любая запись.
  2. Уменьшение общего объема исходного теста. Следствием этого становится повышение читабельности программного обеспечения.
  3. Обеспечение удобных механизмов передачи int и других аргументов в классовый шаблон для их дальнейшей обработки классовыми методами.

Шаблоны класса – это удобно и практично. В особо крупном программном обеспечении соответствующий прием обеспечит более быструю и практичную разработку. А еще – быстродействие получившегося на выходе продукта.

Общая форма представления

Шаблоны класса могут как включать в себя аргументы, так и нет. Общая форма представления рассматриваемого компонента, когда у объекта нет параметров, начинается с ключевого слова. А именно – template.

Вот – пример простейшего общего случая объявления шаблона класса, исключающего наличие тех или иных аргументов:

Шаблоны в СИ-семействе

Здесь:

  • T – это обобщенное имя типа, который будет непосредственно использоваться классовыми методами;
  • ClassName – имя класса, который включает в себя методы управления обобщенным типом класса (не int и ему подобным).

Это – всего лишь один из вариантов представления шаблона класса. Чаще всего рассматриваемый элемент включает в свой состав разнообразные аргументы.

Объект template класса

При работе с изучаемым средством ускорения разработки программного обеспечения программистам нередко приходится иметь дело с объявлением объектов шаблонных классов. Общая форма записи в C++ будет такой:

Шаблоны в СИ-семействе

Здесь:

  • ClassName – имя шаблонного класса;
  • type – конкретный вид информации в приложении (пример – int);
  • objName – имя объекта (экземпляра) имеющегося класса.

При формировании рассматриваемого элемента ключевое слово class может быть изменено. Для этого используется ключевое слово typename. Общая синтаксическая форма объявления шаблона станет такой:

Шаблоны в СИ-семействе

Соответствующий фрагмент позволяет понять, как записывать изучаемый компонент, заменив class на typename.

С аргументами

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

Вот – общая форма представления шаблона, в котором поддерживаются аргументы (int, var или другие):

Шаблоны в СИ-семействе

Здесь:

  • T – некоторый обобщенный информационный вид;
  • type1, …typeN – конкретные виды информации, используемые системой (с именами var1, …, varN или int);
  • var1, …, varN – имена аргументов, используемые в шаблоне записи.

А вот – общая синтаксическая форма объявления объекта template class всего с одним параметром (аргументом):

Шаблоны в СИ-семействе

В соответствующем фрагменте:

  • ClassName – название шаблона;
  • type – информационный вид, для которого будет формироваться реальный class (пример – int);
  • arg – значение используемого в шаблоне аргумента;
  • objName – имя объекта, используемого в качестве template class.

Один аргумент – это не исчерпывающая ситуация. В некоторых задачах рассматриваемый компонент разработки поддерживает два и более параметров.

Два аргумента

Вот – пример, в котором template class поддерживает два аргумента. Он называется CMyArray. Включает в себя методы обработки числовых массивов. В качества типа компонентов можно использовать вещественные компоненты или целочисленные (int).

Шаблоны в СИ-семействе
Шаблоны в СИ-семействе
Шаблоны в СИ-семействе

Здесь template class получает два целых числа (int):

  1. Count – целое число элементов в заданном массиве. Применяется для инициализации class через конструктор с 1 параметром.
  2. Num – число, которое используется для непосредственного проведения различных операций над массивами (тоже выражается как int).

Соответствующие числа применяются в методах для выполнения разнообразных операций над массивом. В шаблоне применяются следующие методы и данные:

  1. Количество элементов в пределах заданного «множества» – n.
  2. Массив элементов (чисел) A заданной размерности (int 10).
  3. Метод Power – используется для возведения составляющих A в степень num. Значение num – входной параметр (аргумент)
  4. Метод CalcNum. Задействуется разработчиком для того, чтобы подсчитывать количество компонентов больше заданного параметра num.

Все это – «база», о которой должен быть в курсе каждый разработчик. Далее предстоит познакомиться с template class в C#.

В C#

Рассматриваемый компонент поддерживается не только в C++, но и в других языках СИ-семейства. Пример – C#. Он появился в языке разработки с версией 7.0. С тех пор каждый новый выпуск версии C# сопровождается новыми шаблонными расширениями.

Для сопоставления шаблонов в C# используются операторы и выражения:

  • is;
  • switch (оператор);
  • switch (выражение, характерное языку с версии 8.0).

В таких конструкциях допускается сравнение входного выражения с любым из следующих «образцов»:

  1. Шаблон объявления. Используется для проверки типа выражения в среде реализации. При условии равенства присваивает объявленной переменной результат соответствующего выражения.
  2. Шаблоны типа (int и не только). Задействуются для проверки типа выражения непосредственно в среде реализации. Компонент известен с C# 9.0.
  3. Константы. Для проверки на факт того, равен ли результат выражения указанной константе. Она может быть выражена int или другими «значениями».
  4. Реляционные templates. Используются для сравнения результата расчетов заданного выражения с той или иной константой. Появились в C# 9.0.
  5. Логические templates. Проверяют, соответствует ли имеющаяся запись логической комбинации templates. Появилась данная категория тогда же, когда и предыдущая.
  6. Свойства. Возникли такие записи в версии 8.0. Проверяют, используют ли свойства или поля выражения вложенных шаблонам.
  7. Позиционный. Отвечает за деконструкцию результата заданных расчетов. Позволяет удостовериться в факте соответствия результатов значениям вложенных templates. Тоже появился в версии языка 8.0.
  8. Var. Сравнивает любые выражения. После этого присваивает полученный результат.
  9. Пустой переменной. Отвечает за сравнение любых выражений. Соответствующая концепция возникла в версии языка 8.0.

Логические templates, а также свойств и позиционные – это рекурсивные записи. Они поддерживают вложенность.

Объявление и тип

В C# при работе с template classes могут использоваться разнообразные templates. Первая категория – объявления и типов. Они применяются для того, чтобы проверить совместимость с указанным видом в среде разработки. с помощью шаблона объявления допускается также создание новой локальной переменной (int и не только). Если «образец объявления» соответствует выражению, переменная получит результат преобразований. Вот – наглядный пример реализации:

Шаблоны в СИ-семействе

Начиная с C# версии 7.0, template объявления с типом T соответствует выражению, если его результат отличен от Null. Также соответствие могут повлечь за собой следующие ситуации:

  • тип результата в среде реализации – T;
  • результирующий тип – это производная от T;
  • результатом становится тип, допускающий значение NULL и имеющий в качестве «базы» T;
  • поддерживается упаковка-преобразование или распаковка-преобразования.

В случае с template type «образец» будет соответствовать написанной «команде», если результат произведенных расчетов не равен NULL. Здесь необходимо также учитывать тип в среде выполнения. Он должен соответствовать любому из ранее указанных требований.

Константы

Рассматривая шаблоны класс и другие их типы, в C# необходимо обратить внимание на шаблон константы. Он появился в 7 версии языка разработки. Позволяет проверять, равен ли результат произведенных расчетов заданному неизменному выражению (оно может являться int). Вот – пример:

Шаблоны в СИ-семействе

В процессе работы с const templates можно использовать любую константную запись:

  • целочисленный литерал (int) или с плавающей запятой;
  • символьные или строковые литералы;
  • логические значения true или false;
  • параметры enum;
  • имя объявленного поля, поддерживающий модификатор const или локальный компонент;
  • null.

Рекомендуется пользоваться соответствующий template для проверки на нулевое значение (null). Для этого подойдет следующий пример:

Шаблоны в СИ-семействе

Компилятор будет гарантировать, что при расчетах x is null не будет осуществляться вызов перегруженного пользователем оператора равенства.

С версии C# 9.0 допускается использование константной «конструкции» null с отрицанием. В этом случае проверяется факт неравенства «пустоте».

Реляционный вид

Используется такая запись для проверки результатов (вида int и не только) с константами. Прием появился в 9 версии рассматриваемого языка разработки.

В реляционных templates допускается применение любых операторов отношений:

  • больше;
  • меньше;
  • больше или равно;
  • меньше или равно.

Первая часть the template – это константа. Соответствующий вид выражения не должен меняться. Он может выступать в виде целого числа (int), компонентами с плавающими точками, символами или enum.

Для проверки нахождения итогового результата произведенных расчетов в том или ином диапазоне пользователю предстоит воспользоваться конъюнкцией (and):

Шаблоны в СИ-семействе

Когда на выходе получается null или не удается преобразовать результат выражения в константный вид через трансформацию, допускающую NULL-значение, или распаковки-преобразования, реляционный template не соответствует изначально написанному выражению.

Логический вид

Начиная с версии C# 9.0, разработчики могут использовать блоки объединения (not, and, or) для создания логических templates:

  1. Отрицания. Используется блок not, а не int. Он соответствует выражению, если template class с отрицанием не соответствует имеющемуся выражению.
  2. Конъюнкции. Для соответствующей операции используется and, соответствующий выражению. Данный принцип соблюдается, если оба templates соответствуют имеющемуся выражению.
  3. Дизъюнкции через or. Соответствие обеспечивается, если хотя бы один из шаблонов соответствует выражению.

Блок объединения and поддерживает более высокий приоритет, чем or. Для выставления приоритета в программном коде используются круглые скобки.

Свойства

В 8 версии рассматриваемого языка появились templates свойств. Они работают не только с int, но и другими видами информации. Такие инструменты помогают сопоставлять свойства или поля в выражении с вложенными templates:

Шаблоны в СИ-семействе

Соответствие подтверждается, если результат расчетов не равен Null, а каждый вложенный компонент соответствует общему свойству/полю итогового выражения.

Данная категория templates является рекурсивной. Это значит, что шаблон int может быть использован в качестве вложенного. Начиная с 10 версии C#, допустимо ссылаться на вложенные свойства или поля в шаблоне свойства. Пример – рефакторинг метода в эквивалентный код:

Шаблоны в СИ-семействе

Выше – наглядный вариант реализации задачи.

Позиционный вид

В 8 версии C# можно работать не только с int и другими разновидностями информации, но и с различными templates. В соответствующей разработке языка появились позиционные шаблоны. Они используются для деконструкции результирующей записи и сравнения итоговых параметров с заданными вложенными templates.

В позиционном шаблоне допускается использование имен компонентов кортежа и параметров метода Deconstruct. Рассматриваемый компонент расширяется несколькими способами:

  • добавлением проверки вида среды выполнения и объявлением переменной (пример – int);
  • путем использования шаблона свойств;
  • за счет объединения двух предыдущих вариантов.

Соответствующая категория templates class в C# рекурсивная.

Var

Var существует в C# достаточно долго – с 7 версии языка разработки. С его помощью удается сопоставлять любые выражения, включая null, а также присваивать получившиеся результаты новым локальным переменным (пример – int):

Шаблоны в СИ-семействе

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

Пустая переменная

В C# с версии 8.0 допускается шаблон пустой переменной «_». Он используется для сопоставления всевозможных записей, включая нулевые:

Шаблоны в СИ-семействе

Данный вариант templates не может быть шаблонов в выражении is или операторе switch. Вместо него рекомендуется пользоваться var.

В круглых скобках

В C# 9.0 появилась возможность использования круглых скобок. Соответствующее правило необходимо для того, чтобы корректировать или подчеркивать приоритет логических шаблонов.

Шаблоны в СИ-семействе

Выше – наглядный пример расстановки приоритетов в языке C#.

P. S. Интересует разработка? Обратите внимание на курс «Программист C». Также в Otus доступно множество других современных курсов.