Язык программирования C++ для профессионалов




Простой шаблон типа - часть 2


stack<shape*> ssp(200); // стек указателей на фигуры stack<Point> sp(400); // стек структур Point

void f(stack<complex>& sc) // параметр типа `ссылка на // complex' { sc.push(complex(1,2)); complex z = 2.5*sc.pop();

stack<int>*p = 0; // указатель на стек целых p = new stack<int>(800); // стек целых размещается // в свободной памяти for ( int i = 0; i<400; i++) { p->push(i); sp.push(Point(i,i+400)); }

// ... }

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

Функции в шаблоне типа могут и не быть подстановками, шаблонный класс stack с полным правом можно определить и так:

template<class T> class stack { T* v; T* p; int sz; public: stack(int); ~stack();

void push(T); T pop();

int size() const; };

В этом случае определение функции-члена stack должно быть дано где-то в другом месте, как это и было для функций- членов обычных, нешаблонных классов. Подобные функции так же параметризируются типом, служащим параметром для их шаблонного класса, поэтому определяются они с помощью шаблона типа для функции. Если это происходит вне шаблонного класса, это надо делать явно:

template<class T> void stack<T>::push(T a) { *p++ = a; }

template<class T> stack<T>::stack(int s) { v = p = new T[sz=s]; }

Отметим, что в пределах области видимости имени stack<T> уточнение <T> является избыточным, и stack<T>::stack - имя конструктора.

Задача системы программирования, а вовсе не программиста, предоставлять версии шаблонных функций для каждого фактического параметра шаблона типа. Поэтому для приводившегося выше примера система программирования должна создать определения конструкторов для классов stack<shape*>, stack<Point> и stack<int>, деструкторов для stack<shape*> и stack<Point>, версии функций push() для stack<complex>, stack<int> и stack<Point> и версию функции pop() для stack<complex>. Такие создаваемые функции будут совершенно обычными функциями-членами, например:




Содержание  Назад  Вперед