оператором return, создателем языка Бьерном Страуструпом был изна­чально назван шаблоном функции. Данный термин отражает, что мы име­ем дело с определенным видом шаблона, отличающимся от шаблонов классов, о которых речь пойдет ниже. Сегодня многие авторы используют вместо этого выражение шаблонная функция (template funcion), потому что шаблоны указанного типа очень похожи на обычные функции. В этой кни­ге мы также будем использовать термин шаблонная функция, а иногда даже просто функция для обозначения этих шаблонов. То же относится и к об­суждаемому ниже понятию, которое изначально получило наименование шаблон класса, а в книге зовется шаблонным классом (template class) или просто классом.

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

Мы можем использовать тип как параметр (Гв предыдущем примере) для классов почти так же, как и для функций. Предположим, нам нужен класс Pair, чтобы хранить пары значений. Иногда оба значения принадлежат к ти­пу double, иногда к типу int. Тогда вместо двух новых классов, к примеру,

class PairDouble   { public:

PairDouble(double xl,   double yl):   x(xl),   y(yl)   {}

void showQ(); private:

double x,   y; };

void PairDouble::showQ() {    cout << x/y <<  endl; }

после чего следует аналогичный фрагмент с классом Pairlnt, нам достаточ­но написать один шаблонный класс:

II  cltempl.cpp:   Шаблонный класс. #include <iostream.h>

template <class T> class  Pair   { public:

Pair(T xl,   Tyl):   x(xl),  y(yl){}

void showQ(); private:

T x,  y; };

template <class T>

void Pair<T>::showQ() {  cout << x/y << endl; }

int main()

{  Pair<double> a(37.0, 5.0);

Pair<int> u(37, 5);

a.showQ();

u.showQ();

return 0; }

Способ, каким функции-члены шаблонного класса, в этом примере showQ, определены вне класса, может с первого взгляда показаться сложным. Но на самом деле эта конструкция весьма логична: имя любой функции-чле­на, когда эта функция определяется вне класса, должно быть предварено выражением

type::

и вполне резонно, что вместо type в нашем случае мы пишем Pair<T>. Кро­ме того, как пользователи STL мы можем не беспокоиться об определени­ях, так как шаблонные классы STL доступны в виде файлов заголовков, которые можно использовать, не вдаваясь в подробности их программи­рования


<< назад вперед >>