С++ для начинающих



         

Специализации шаблонов классов *


Прежде чем приступать к рассмотрению специализаций шаблонов классов и причин, по которым в них может возникнуть надобность, добавим в шаблон Queue функции-члены min() и max(). Они будут обходить все элементы очереди и искать среди них соответственно минимальное и максимальное значения (правильнее, конечно, использовать для этой цели обобщенные алгоритмы min() и max(), представленные в главе 12, но мы определим эти функции как члены шаблона Queue, чтобы познакомиться со специализациями.)

template <class Type>

class Queue {

   // ...

public:

   Type min();

   Type max();

   // ...

};

// найти минимальное значение в очереди Queue

template <class Type>

   Type Queue<Type>::min()

{

   assert( ! is_empty() );

   Type min_val = front->item;

   for ( QueueItem *pq = front->next; pq != 0; pq = pq->next )

      if ( pq->item < min_val )

         min_val = pq->item;

   return min_val;

}

// найти максимальное значение в очереди Queue

template <class Type>

   Type Queue<Type>::max()

{

   assert( ! is_empty() );

   Type max_val = front->item;

   for ( QueueItem *pq = front->next; pq != 0; pq = pq->next )

      if ( pq->item > max_val )

         max_val = pq->item;

   return max_val;

}

Следующая инструкция в функции-члене min() сравнивает два элемента очереди Queue:

pq->item < min_val

Здесь неявно присутствует требование к типам, которыми может конкретизироваться шаблон класса Queue: такой тип должен либо иметь возможность пользоваться предопределенным оператором “меньше” для встроенных типов, либо быть классом, в котором определен оператор operator<(). Если же этого оператора нет, то попытка применить min() к очереди приведет к ошибке компиляции в том месте, где вызывается несуществующий оператор сравнения. (Аналогичная проблема существует и в max(), только касается оператора operator>()).

Предположим, что шаблон класса Queue нужно конкретизировать таким типом:

class LongSouble {




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