    Следующий пример поможет прояснить, как с помощью шаблонов можно уменьшить 
размер и cложность программ, предоставив компилятору реализацию обобщенных 
функций. В листинге 15.10 объявляются два полезных шаблона функций min() и 
mах(). Это всего лишь заголовочный файл, и вы не можете его скомпилировать.	: 

    Листинг 15.10.  MINMAX.H (шаблоны функций min и max) 

    1:	// minmax.h -- Шаблоны функций min и шах 
    2: 
    3:	#ifndef __MINMAX_H 
    4:	#define _MINMAX H 1 // Предотвращение повторных «indlude 
    5: 
    6:	template<class Т> Т max(T а, Т b) 
    7:	{ 
    8:	if (а > b)           
    9:	  return a;                                                               
    10:	else                                                                . 
    11:	  return b;                                                              
    12:	} 
    13:	
    14:	template<class T> Т min(T а, Т b) 
    15:	{                                                                  
    16:	  if (a < b)                                                 .           
    17:	    return a;          
    18;	else                 
    19:	  return b;      
    20:	}                                                                      
    21: 
    22:	#endif //  MINMAX H 

    Рассмотрим подробнее строку 6. В ней Т заявлен неопределенным типом, 
объект которого возвращает шаблонная функция mах(). Кроме того, функции mах()
необходимы два аргумента типа Т. Операторы в функции, приведенные в строках 
8-11 — схема для реальных операторов, которые будут сгенерированы позже, когда 
будет задан действительный тип Т. Шаблон функции min() объявляется аналогичным образом. 
    Вы можете использовать более одного неопределенного типа. Для объявления 
mах() с двумя различными неопределенными типами можно написать: 

     template<class T1,  class T2> T1 max(T1 a,  T2 b) 

    В этой версии функция mах() будет возвращать значение типа Т1, и ей 
необходимы два аргумента: один — типа Т1, другой — типа Т2.
    В программе, использующей шаблонные функции, необходимо лишь указать их 
прототипы, которые компилятор использует для создания действительных тел 
функции. В листинге 15.11 приводится пример такой программы.

    Листинг 15.11.  FTEMPLAT.CPP (использование шаблонов функций) 

    1:	#include <iostream.h> 
    2:	#include "minmax.h" 
    4:	int max(int a,  int b); 
    5:	double max(double a,  double b); 
    6:	char max(char a,   char b); 
    7:	
    8:	main()       
    9:	{        
    10:	   int i1 = 100,  12 = 200;                                           . 
    11:	  double d1 = 3.14159, d2 = 9.87654; 
    12:	  char c1 =  'A',  c2 = 'z'; 
    13: 
    14:	  cout « "max(i1,   i2) == " « max(i1,  i2) « '\n'; 
    15:	  cout « "max(d1,  d2) == " « raax(d1,  d2) « '\n'; 
    16:	  cout « "nax(c1, c2) ~ " « max(c1, c2) « '\n'\ 
    17:	  return 0;                                                             
    18:	} 

    В строках 4-6 объявляются три прототипа шаблонной функции mах(). Эти строки 
дают компилятору необходимую информацию для реализации трех перегруженных 
функций mах(). Все функции mах() возвращают объекты различных типов данных и 
требуют два аргумента этих же типов. В основной программе функции mах()
вызываются в строках 14-16. Вы можете пользоваться шаблонными функциями точно 
так же, как и обычными. 


    390     Часть III. Программирование на ANSI C++ 
