    18:	{ 
    19:	TPoint p; 
    20: 
    21:	cout « p « An'; 
    22:	p.PutX(I00); 
    23:	p.PutY(200); 
    24:	cout « p « '\n'; 
    25:	cout « "\nEnter x and у values: "; 
    26:	cin » p; 
    27:	cout « "\n You entered: " « p; 
    28:	return 0; 
    29:	} 
    30: 
    31:	ost ream& operator«(ostream& os, TPoint &p) 
    32:	{ 
    33:	  os « "x == " « p.x « ",  у == " « p.у; 
    34:	  return os; 
    35:	} 
    36: 
    37:	istreamA operator»(istream& is, TPoint &p) 
    38:	{ 
    39:	  is » p.x » p.y; 
    40:	  return is; 
    41:	}
 
    В строке 14 для класса TPoint объявляется дружественная функция-член ввода 
из потока operator»(), аналогичная функции перегрузки оператора вывода в 
поток, приведенной в предыдущем разделе, только вместо ostream используется istream. 
    В реализации функции (строки 37-41) читаются значения для х и у с помощью 
ссылки is на istream. Функция возвращает ссылку is, таким образом можно 
вводить несколько значений в одном операторе ввода. 
    При запуске программы на выполнение запрашиваются два значения для х и у. 
Введите два целочисленных значения, разделенных пробелом. Оператор ввода из 
потока в строке 26 сохранит оба введенных вами значения в объекте класса, 
которые затем отобразятся в строке 27. 

    Шаблоны 

    Подобно тому как класс представляет собой схематическое описание 
построения объекта, так и шаблон предcтавляет собой схематическое описание 
построения функций и классов. Шаблоны особенно полезны в библиотеках классов, 
которыми пользуются многие программисты. Шаблоны, иногда также называемые 
параметризованными типами, указывают лишь спецификации для функций и классов, 
но не детали настоящей реализации. 

    Шаблонные функции 

    Шаблоны функций описывают общие свойства функций, подобно рецепту 
приготовления пирожного. Шаблоны функций, обычно объявляемые в заголовочном 
файле, имеют следующий общий вид: 

    template<class T> void f(T param) 
    { 
       // Тело функции 
    } 

    Шаблонная функция начинается строкой template<class Т>, указывающей 
компилятору, что Т — определяемое пользователем имя функции. (Вы можете 
заменить Т на любое другое имя, если захотите.) Необходим, по крайней мере, 
один параметр Т для передачи функции данных для обработки. Вы можете также 
задать указатель (Т* param) или ссылку (Т& param). Функция может объявлять 
несколько параметров и возвращать значение типа Т: 

    template<class Т> Т f(int а, Т b) { 
           // Тело функции 
    } 

    В этой версии шаблонная функция f() возвращает значения типа Т и имеет два 
параметра — целое с именем a и неопределенный объект Т с именем b. 
Пользователи шаблона укажут действительный тип данных для Т. Например, в программе 
можно задать следующий прототип: 

    double f(int a, double b); 

    Если это обычная функция, вы должны обеспечить ее реализацию. Однако, 
поскольку f() — шаблонная функция, компилятор реализует код функции, заменив Т в 
данном случае на double. 


    15. Передовые средства C++     389 
