Шаблоны в C++

Нередко бывает так, что одна и та же функция может использоваться для разных типов данных. Конечно, проще всего создать несколько функций (просто скопировав код и изменив тип данных результата) и использовать их в программе. Но мы ведь не ищем легких путей, верно?

Так вот: того же результата (только быстрее и, если разобраться, значительно проще) можно достичь, используя шаблоны. И, кстати, если вдруг в созданной функции обнаружится ошибка – изменения будет значительно проще внести в шаблон, нежели в функции-клоны.

Шаблон представляет собой описание функции (или же класса) благодаря которому, в процессе выполнения программы, происходит генерация конкретной функции (или же класса). В принципе, шаблон можно рассматривать как строку подстановку (которая является аналогом препроцессора).

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

Код вносится в заглавный файл:

template<class T> // T - параметр шаблона
class TVector
{
public:
  TVector(int); // Конструктор класса Tvector
 
  ~TVector() // Деструктор
  {
    delete [] data;
  }
 
  // Расширение действия (перегрузка) операции "[]":
  T &operator [](int i)
  {
    return data [i];
  }
 
protected:
  T *data;  // Начало одномерного массива
  int size; // Количество элементов в массиве
};

Непосредственно код нашого вектора:

template<class T> TVector <T>::TVector(int n)
{
  data = new T[n];
  size = n;
};

Инициализация может быть выполнена так:

 TVector<int> X(5);                    //Создаем объект класса "целочисленный вектор"
  TVector<char> C(5);                   // Создаем объект класса "символьный вектор"
  TVector<String> S(5);     // Создаем объект класса "строчный вектор"

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

5 comments on “Шаблоны в C++

    1. Если вы в проекте используете один и тот же класс, но с разными типами данных, то профит очевидный: в случае изменений в методах не придется переписывать каждый класс — достаточно будет исправить шаблон.

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

        1. На счет продуктивности — да, не всегда. Материал носит скорее информационный характер, нежели призыв использовать их повсеместно.

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

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