Всем привет, в наши дни становится популярной концепция общего программирования или метапрограммирования. C ++ - один из самых любимых языков программирования, которым пользуются многие программисты во всем мире. Общее программирование - очень мощная функция, поддерживаемая C ++, но, к сожалению, при изучении этого языка большую часть времени эта тема остается нетронутой для многих изучающих. Я хотел бы дать краткое введение в эту тему и познакомить вас с общим программированием на C ++. Итак, не тратя время на дополнительные слова, я хотел бы сразу перейти к теме, познакомив всех вас с тем, что подразумевается под общим программированием.

«Написание кода, который работает с различными типами в качестве аргументов, если эти типы аргументов соответствуют определенным синтаксическим и семантическим требованиям».

- Бьярне Страуструп

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

Шаблон в C ++ - это функция, которая позволяет нам определять общие функции и классы, что в конечном итоге приводит к поддержке универсального программирования на C ++.

Что такое шаблон C ++

Шаблон - это общий план, который компилятор использует для создания специализированных функций и классов. Мы определяем шаблон с типом заполнителя, а затем подключаем фактический тип, который нам нужен, когда он нам нужен. Затем компилятор генерирует нужный нам класс. Всегда помните, что все это происходит только во время компиляции в C ++. Если вы знаете другие языки программирования, возможно, вы видели, как это происходит во время выполнения. Это дает преимущество в том, что компилятор сам проверяет типы во время компиляции перед выполнением программы, что снижает риск ошибки во время выполнения. Основная идея заключается в том, что нам просто нужно определить план функции или класса, и компилятор сгенерирует для него фактический код позже, определив его тип.

C ++ в основном поддерживает шаблоны функций и классов.

Шаблон функции

В этом разделе мы увидим, как создать функцию-шаблон. Предположим, у нас есть функция с именем max, которая возвращает максимум из двух переданных ей чисел. Если бы мы обычно создавали такую ​​функцию в нашей программе на C ++ для типа данных int, она бы выглядела так, как показано выше.

Но что, если мы хотим передать этой функции значение типа double или char? Если мы это сделаем, мы получим ошибку времени компиляции. Поскольку тип, для которого мы создали эту функцию, - int. Итак, чтобы создать такую ​​же функцию для любого другого типа данных, нам нужно снова написать тот же код, просто изменив тип возвращаемого значения функции и тип аргумента. Кроме того, все в теле функции будет избыточным. Эту проблему можно решить с помощью универсального программирования с использованием шаблона функции.

Чтобы объявить шаблон функции, у нас есть следующий синтаксис.

Давайте рассмотрим приведенный выше синтаксис. Во-первых, у нас есть ключевое слово шаблона, которое указывает, что эта функция является функцией шаблона. Далее идет класс, который является ключевым словом, определяющим универсальный тип в объявлении шаблона. Мы также можем написать альтернативные ключевые слова как typename вместо class. Ttype - это заполнитель для типа данных нашей функции. Он также используется в теле функции. Компилятор автоматически заменяет тип фактическим типом данных. Итак, шаблон для нашей функции max будет выглядеть, как показано ниже.

Как вы можете видеть на изображении выше, T - это Ttype, который мы назвали заполнителем для нашего типа данных, и вы можете использовать там любую букву вместо T.

Теперь мы можем использовать эту функцию для любого типа данных, которые поддерживают оператор ›(больше). Например, теперь мы можем передать в нашу функцию строку, char, int, double любых данных, и код для нее останется прежним.

Чтобы вызвать указанную выше функцию max, мы используем синтаксис как

В приведенном выше коде вы можете видеть, что мы вызвали функцию max двумя способами.

Во-первых, указав наш тип данных в скобках ‹› как int. Компилятор заменит этот тип данных на T, который мы указали в качестве заполнителя при определении нашей функции шаблона. Но если мы не укажем тип и передадим аргументы напрямую, компилятор C ++ автоматически определит тип данных, которые мы передали ему в качестве аргумента.

Точно так же мы можем использовать ту же функцию для других типов данных, как показано ниже.

Я думаю, что теперь совершенно ясно, как вы можете объявить функцию динамического шаблона в C ++, которая может работать с разными типами данных для выполнения одной и той же функции.

Здесь следует отметить одну вещь: мы не можем использовать эту функцию-шаблон напрямую с пользовательскими типами данных, такими как структура. Предположим, у нас есть конструкция с именем шпилька. Он содержит два члена stud_id и stud_name. Если мы передадим этот тип данных нашей функции max, это не сработает, потому что в этом случае оператор ›(больше) должен быть перегружен. Следовательно, в таких случаях нам нужно определить нашу собственную логику сравнения, перегрузив оператор ›(больше).

Шаблон класса

На данный момент мы увидели, что означает шаблон функции и как мы его реализуем. Теперь давайте посмотрим на шаблон класса. Шаблон класса аналогичен шаблону функции, но вместо создания универсальной функции мы будем создавать универсальный класс, который подразумевает все атрибуты, методы, конструкторы и деструкторы класса. Так же, как мы можем подключить любой тип данных к функции, мы можем сделать то же самое с универсальным классом. В предыдущем разделе мы написали план функции. Теперь в этом разделе мы напишем план класса. Затем компилятор генерирует соответствующий класс из чертежа. Если вы уже знакомы с библиотекой STL C ++, вы должны знать о векторах. Когда мы создаем векторы, мы указываем тип данных, которые хотим сохранить в нашем векторе. Итак, мы можем сказать, что это также план универсального класса. В этом суть метапрограммирования.

Предположим, вы хотите хранить разные типы данных вместе как узел, поэтому у нас есть класс с именем

Узел, как показано ниже,

В приведенном выше фрагменте кода мы создали класс Node с двумя закрытыми членами типа int и string, и у нас есть сеттеры и геттеры для обоих атрибутов. Я надеюсь, что все знакомы с концепцией OOPS. А теперь представьте, хочу ли я, чтобы этот класс хранил данные типа double вместо int. Самый простой вариант, который у нас есть, - это создать новый класс с другим именем, определить требуемый тип данных и написать для него некоторый код. Итак, для решения этой проблемы у нас есть шаблонный класс.

Давайте научимся создавать шаблон класса на C ++.

Во-первых, в приведенном выше синтаксисе у нас есть ключевые слова-шаблоны, заключенные в скобки ‹›. Это указывает на то, что приведенный ниже класс является классом-шаблоном. Далее в скобках со стрелками у нас есть typename, которое является ключевым словом, определяющим универсальный тип в объявлении класса шаблона. Раньше мы использовали ключевые слова class, как я сказал, typename и class работают и используются для той же цели. Тип - это имя заполнителя. Он определяется при создании экземпляра класса. Если мы хотим определить более одного универсального типа, мы можем использовать запятую между двумя типами. Затем мы используем Ttype для использования в качестве заполнителя типа данных для наших атрибутов и методов. Как я уже упоминал, мы можем использовать более одного типа, если у нас есть разные атрибуты разных типов, мы можем указать для них уникальную букву. Вы поймете это на примере.

В приведенном выше примере мы объявили шаблонный класс с именем Node, который имеет T в качестве заполнителя для определенного типа данных, который будет определяться компилятором при создании экземпляра объекта этого класса. Мы указали там два атрибута, названные first и second. Оба имеют тот же тип, что и T (заполнитель). Кроме того, методы получения также будут иметь тот же тип возвращаемого значения, что и атрибуты.

Если мы используем несколько типов данных в нашем классе шаблона, чтобы разные атрибуты могли иметь разные типы. Как и в предыдущем случае, у нас были int и строка. Итак, мы можем внести соответствующие изменения в наш шаблон,

В приведенном выше фрагменте кода мы взяли два типа с именами T1 и T2. В нашем классе есть два атрибута с именами first и second. Первый атрибут объявлен как тип T1, а второй объявлен как тип T2. Точно так же оба атрибута имеют свои методы установки и получения с соответствующим именем типа в качестве возвращаемого типа. Кроме того, вы можете видеть, что аргумент, который передается методам установки, также определяется как имя типа T1 и T2 соответственно. Это означает, что мы можем использовать typename в теле класса везде, где это необходимо.

Теперь, когда мы узнали, как определить шаблон или общий план класса, давайте посмотрим, как мы создаем экземпляр этого класса.

Итак, как обычно, это очень просто, у нас есть className в качестве имени нашего класса, а objectName - это имя нашего объекта. Тип в скобках ‹› - это тип, для которого мы хотим создать наш универсальный класс. Если мы определили несколько имен типов в схеме, то обязательно передать их при создании экземпляра, разделив их запятыми.

В приведенном выше примере, как вы можете видеть, мы создали объект класса Node как n1. Наш класс Node имеет два типа имен T1 и T2, которые теперь будут заменены на string и double соответственно. Поскольку мы объявили первый атрибут типа T1, теперь он будет строкой, поэтому для метода установки мы передали строку «abcd», а для метода получения мы сначала сохранили результат в строковой переменной. Точно так же мы сделали это для нашего второго атрибута.

Резюме

Теперь, я думаю, вы должны иметь четкое представление об общем программировании на C ++. Кроме того, теперь вы знакомы с функциональными шаблонами и шаблонами классов в C ++. Все контейнеры в C ++ STL, такие как векторы, пары, карты, реализованы с использованием шаблона универсального класса. Вот почему у нас одинаковый синтаксис для создания экземпляров контейнеров STL C ++. Это придает им динамический характер типов, что делает наше программирование более гибким и эффективным. Выше представлен небольшой обзор того, что мы изучили в этом блоге.

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

2. Шаблоны бывают двух типов: функции и класс, и они позволяют нам создавать функции и классы, которые могут поддерживать различные типы данных.

3. Это приводит к более быстрой и эффективной разработке и сокращает количество избыточного кода в нашем проекте.

4. Функции и шаблоны классов поддерживают несколько параметров с разными типами.

использованная литература







Авторы: Танай Вартак, Шайлеш Кадам, Тасмия Канкурти, Рутвик Дешмук, Кальяни Видхате.