Нередко бывает так, что одна и та же функция может использоваться для разных типов данных. Конечно, проще всего создать несколько функций (просто скопировав код и изменив тип данных результата) и использовать их в программе. Но мы ведь не ищем легких путей, верно?
Так вот: того же результата (только быстрее и, если разобраться, значительно проще) можно достичь, используя шаблоны. И, кстати, если вдруг в созданной функции обнаружится ошибка – изменения будет значительно проще внести в шаблон, нежели в функции-клоны.
Шаблон представляет собой описание функции (или же класса) благодаря которому, в процессе выполнения программы, происходит генерация конкретной функции (или же класса). В принципе, шаблон можно рассматривать как строку подстановку (которая является аналогом препроцессора).
Ниже приведу пример простейшего шаблона. Будем создавать вектор, содержащий целые числа, строки, символы.
Код вносится в заглавный файл:
template // T - параметр шаблона
class TVector
{
public:
TVector(int); // Конструктор класса Tvector
~TVector() // Деструктор
{
delete [] data;
}
// Расширение действия (перегрузка) операции "[]":
T &operator [](int i)
{
return data [i];
}
protected:
T *data; // Начало одномерного массива
int size; // Количество элементов в массиве
};
Непосредственно код нашого вектора:
template TVector ::TVector(int n)
{
data = new T[n];
size = n;
};
Инициализация может быть выполнена так:
TVector X(5); //Создаем объект класса "целочисленный вектор"
TVector C(5); // Создаем объект класса "символьный вектор"
TVector S(5); // Создаем объект класса "строчный вектор"
Обращение к созданным классам в дальнейшем выполняется так же, как если бы классы создавались без помощи шаблона.
А чё дальше с этим делать? Какой профит?)
Если вы в проекте используете один и тот же класс, но с разными типами данных, то профит очевидный: в случае изменений в методах не придется переписывать каждый класс – достаточно будет исправить шаблон.
умно
За все надо платить. Под каждый тип компилятору приходится генерить определенную служебную информацию.
Поэтому, шаблоны не всегда продуктивны
На счет продуктивности – да, не всегда. Материал носит скорее информационный характер, нежели призыв использовать их повсеместно.