Рубрики

Шаблоны в C ++

Шаблон — это простой и очень мощный инструмент в C ++. Простая идея — передать тип данных в качестве параметра, чтобы нам не нужно было писать один и тот же код для разных типов данных. Например, компании-разработчику программного обеспечения может понадобиться метод sort () для разных типов данных. Вместо того, чтобы писать и поддерживать несколько кодов, мы можем написать один sort () и передать тип данных в качестве параметра.

C ++ добавляет два новых ключевых слова для поддержки шаблонов: «template» и «typename» . Второе ключевое слово всегда можно заменить на ключевое слово «класс».

Как работают шаблоны?
Шаблоны раскрываются во время компиляции. Это как макросы. Разница в том, что компилятор проверяет тип перед расширением шаблона. Идея проста, исходный код содержит только функцию / класс, но скомпилированный код может содержать несколько копий одной и той же функции / класса.

Шаблоны функций Мы пишем обобщенную функцию, которую можно использовать для разных типов данных. Примерами шаблонов функций являются sort (), max (), min (), printArray ().
Узнайте больше о Generics в C ++

#include <iostream>

using namespace std;

  
// Одна функция работает для всех типов данных. Это будет работать
// даже для пользовательских типов, если оператор '>' перегружен

template <typename T>

T myMax(T x, T y)
{

   return (x > y)? x: y;

}

  

int main()

{

  cout << myMax<int>(3, 7) << endl;  // Вызов myMax для int

  cout << myMax<double>(3.0, 7.0) << endl; // вызвать myMax для двойного

  cout << myMax<char>('g', 'e') << endl;   // вызываем myMax для char

  

  return 0;

}

Выход:

7
7
g

Ниже приведена программа для реализации Bubble Sort с использованием шаблонов на C ++:

// код CPP для пузырьковой сортировки
// используя функцию шаблона
#include <iostream>

using namespace std;

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

template <class T>

void bubbleSort(T a[], int n) {

    for (int i = 0; i < n - 1; i++)

        for (int j = n - 1; i < j; j--)

            if (a[j] < a[j - 1])

              swap(a[j], a[j - 1]);

}

   
// Код драйвера

int main() {

    int a[5] = {10, 50, 30, 40, 20};

    int n = sizeof(a) / sizeof(a[0]);

   

    // вызывает функцию шаблона

    bubbleSort(a, 5);

   

    cout << " Sorted array : ";

    for (int i = 0; i < n; i++)

        cout << a[i] << " ";

    cout << endl;

   

  return 0;

}

Выход :

Sorted array : 10 20 30 40 50

Шаблоны классов Как и шаблоны функций, шаблоны классов полезны, когда класс определяет что-то, что не зависит от типа данных. Может быть полезно для таких классов, как LinkedList, BinaryTree, Stack, Queue, Array и т. Д.

Ниже приведен простой пример шаблона класса Array.

#include <iostream>

using namespace std;

  

template <typename T>

class Array {

private:

    T *ptr;

    int size;

public:

    Array(T arr[], int s);

    void print();

};

  

template <typename T>

Array<T>::Array(T arr[], int s) {

    ptr = new T[s];

    size = s;

    for(int i = 0; i < size; i++)

        ptr[i] = arr[i];

}

  

template <typename T>

void Array<T>::print() {

    for (int i = 0; i < size; i++)

        cout<<" "<<*(ptr + i);

    cout<<endl;

}

  

int main() {

    int arr[5] = {1, 2, 3, 4, 5};

    Array<int> a(arr, 5);

    a.print();

    return 0;

}

Выход:

 1 2 3 4 5

Может ли быть больше одного аргумента для шаблонов?
Да, как и обычные параметры, мы можем передавать более одного типа данных в качестве аргументов шаблонам. Следующий пример демонстрирует то же самое.

#include<iostream>

using namespace std;

  

template<class T, class U>

class A  {

    T x;

    U y;

public:

    A() {    cout<<"Constructor Called"<<endl;   }

};

  

int main()  {

   A<char, char> a;

   A<int, double> b;

   return 0;

}

Выход:

Constructor Called
Constructor Called

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

#include<iostream>

using namespace std;

  

template<class T, class U = char>

class A  {

public:

    T x;

    U y;

    A() {   cout<<"Constructor Called"<<endl;   }

};

  

int main()  {

   A<char> a;  // Это вызовет A <char, char>

   return 0;

}

Выход:

Constructor Called

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

Что происходит, когда в классе / функции шаблона есть статический член?
Каждый экземпляр шаблона содержит собственную статическую переменную. См. Шаблоны и Статические переменные для более подробной информации.

Что такое специализация шаблонов?
Специализация шаблонов позволяет нам иметь другой код для определенного типа данных. См. Шаблон специализации для более подробной информации.

Можем ли мы передать нестандартные параметры в шаблоны?
Мы можем передавать не типовые аргументы в шаблоны. Нетипичные параметры в основном используются для указания максимальных или минимальных значений или любых других постоянных значений для конкретного экземпляра шаблона. Важно отметить, что параметры не типового типа должны быть постоянными. Компилятор должен знать значение не типовых параметров во время компиляции. Потому что компилятор должен создавать функции / классы для указанного не типового значения во время компиляции. В приведенной ниже программе, если мы заменим 10000 или 25 на переменную, мы получим ошибку компилятора. Пожалуйста, посмотрите это .

Ниже приведена программа на C ++.

// Программа на C ++ для демонстрации работы не-типа
// параметры для шаблонов в C ++.
#include <iostream>

using namespace std;

   

template <class T, int max>

int arrMin(T arr[], int n)

{

   int m = max;

   for (int i = 0; i < n; i++)

      if (arr[i] < m)

         m = arr[i];

   

   return m;

}

   

int main()

{

   int arr1[]  = {10, 20, 15, 12};

   int n1 = sizeof(arr1)/sizeof(arr1[0]);

   

   char arr2[] = {1, 2, 3};

   int n2 = sizeof(arr2)/sizeof(arr2[0]);

   

   // Второй параметр шаблона для arrMin должен быть константой

   cout << arrMin<int, 10000>(arr1, n1) << endl;

   cout << arrMin<char, 256>(arr2, n2);

   return 0;

}

Выход:

10
1

Что такое шаблонное метапрограммирование?
Смотрите шаблон метапрограммирования

Вы также можете пройти тест по шаблонам .

Java также поддерживает эти функции. Java называет это дженериками .

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

Рекомендуемые посты:

Шаблоны в C ++

0.00 (0%) 0 votes