Нередко бывает так, что одна и та же функция может использоваться для разных типов данных. Конечно, проще всего создать несколько функций (просто скопировав код и изменив тип данных результата) и использовать их в программе. Но мы ведь не ищем легких путей, верно?
Так вот: того же результата (только быстрее и, если разобраться, значительно проще) можно достичь, используя шаблоны. И, кстати, если вдруг в созданной функции обнаружится ошибка – изменения будет значительно проще внести в шаблон, нежели в функции-клоны.
Шаблон представляет собой описание функции (или же класса) благодаря которому, в процессе выполнения программы, происходит генерация конкретной функции (или же класса). В принципе, шаблон можно рассматривать как строку подстановку (которая является аналогом препроцессора).
Ниже приведу пример простейшего шаблона. Будем создавать вектор, содержащий целые числа, строки, символы.
Код вносится в заглавный файл:
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); // Создаем объект класса "строчный вектор" |
Обращение к созданным классам в дальнейшем выполняется так же, как если бы классы создавались без помощи шаблона.
А чё дальше с этим делать? Какой профит?)
Если вы в проекте используете один и тот же класс, но с разными типами данных, то профит очевидный: в случае изменений в методах не придется переписывать каждый класс — достаточно будет исправить шаблон.
умно
За все надо платить. Под каждый тип компилятору приходится генерить определенную служебную информацию.
Поэтому, шаблоны не всегда продуктивны
На счет продуктивности — да, не всегда. Материал носит скорее информационный характер, нежели призыв использовать их повсеместно.