Учебник по Visual C++ .Net



     создание сайта на HTML |         

Шаблоны STL — это библиотека шаблонов


max (long a, long b);

double max (double a, double b);

MyType max (mytype a, mytype b);

Vectors max (Vectors a, Vectors b);

Очевидно, что тела всех функций могут выглядеть совершенно одинаково для многих типов параметров. Например, коды функции max могут иметь вид:

return (a>b) ? а : b;

В таких случаях удобно использовать шаблон функции. Шаблон задается ключевым словом template:

template <class Т> Т max(Т х, Т у)

{

return (х>у) ? х : у;

};

Описатель <class т> — это аргумент шаблона. Символ т (type) означает произвольный тип данных т, который будет задан при использовании шаблона, т выполняет роль формального параметра, поэтому сам символ (т) может быть и другим, но везде одинаковым. При фактическом использовании шаблона место т заменяет какой-то уже описанный тип. Им может быть как стандартный, встроенный тип языка, так и новый тип, определенный пользователем. В том числе он может быть именем класса, определенного ранее. Важно, чтобы для типа был определен смысл операции > (больше). Если т заменяется классом, то в классе должна быть предварительно реализована операция operator> ().

Не идите на поводу у ложного друга — переводчика термина operator. В английском языке он имеет смысл операции (например, операция + или операция <, операция логического или |, и т. д.). То, что мы называем оператором языка (например, оператор while, оператор for, условный оператор if, и т. д.), имеет английский аналог — statement (например, conditional statement if).

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

Man a("Alex Black", 54), b("Galina Black", 44), с;

с = max (a, b);

cout « "\n Старший: " « с;

компилятор в сгенерированной по шаблону копии функции max при сравнении объектов класса Man использует функцию operator > (), которая должна быть определена внутри класса Man. Например, так:




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